<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jeremy Smyth's Blog</title>
	<atom:link href="http://jeremysmyth.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://jeremysmyth.com</link>
	<description></description>
	<lastBuildDate>Sat, 25 Jun 2011 12:58:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Privacy and Encryption: Lose one, lose &#8216;em all</title>
		<link>http://jeremysmyth.com/2011/06/25/privacy-and-encryption-lose-one-lose-em-all/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=privacy-and-encryption-lose-one-lose-em-all</link>
		<comments>http://jeremysmyth.com/2011/06/25/privacy-and-encryption-lose-one-lose-em-all/#comments</comments>
		<pubDate>Sat, 25 Jun 2011 12:53:27 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=313</guid>
		<description><![CDATA[
Let me start with a little imagination. An analogy, if you will.
Imagine, if you will, that you are on holiday. You want to send a &#8220;wish you were here&#8221; type message to your friend back home. You have two choices: a cheapish picture postcard, or a more expensive sealed envelope. What do you choose? If [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm3.static.flickr.com/2654/4105726930_c42e8b12b9_m.jpg" style="float:right" title="Privacy?" alt="Privacy: a photo by alancleaver_2000" /></p>
<p>Let me start with a little imagination. An analogy, if you will.</p>
<p>Imagine, if you will, that you are on holiday. You want to send a &#8220;wish you were here&#8221; type message to your friend back home. You have two choices: a cheapish picture postcard, or a more expensive sealed envelope. What do you choose? If you&#8217;re like the vast majority of us, you will likely choose the postcard, for both picturesque and cost reasons.</p>
<p>
On the other hand, let&#8217;s assume you want to send your credit card number and salary details to an insurance agency. Again, do you choose the postcard, or the sealed envelope? I will not insult your intelligence by saying what the &#8220;right answer&#8221; is. I will however allow someone else to continue this analogy on my behalf, with a slight piece of satire:</p>
<blockquote><p><em><br />
the government has announced that it will soon be mandatory to use state-approved envelopes to send all mail. these new envelopes will be entirely transparent when viewed under a federally produced lightbulb, but there is no need to worry about these lamps getting out to bad people, since it is time-tested proof that all government employees are completely honest and lack all self-serving traits present in every other human being. besides, it&#8217;s for your own good and protection! and if you have something to write that you don&#8217;t want everyone to read, maybe it&#8217;s time for that all-important self-examination to reveal your underlying paranoia complex&#8230; </em></p></blockquote>
<p><i>(quote taken from a <a href="http://slashdot.org/comments.pl?sid=21762&#038;cid=2320830" target="_new">Slashdot comment</a>, written by someone called CrudPuppy)</i></p>
<p>How does that make you feel? If you honestly sat down and thought about that eventuality, would you be happy about the idea of someone, anyone, being able to read your most private thoughts and words? Is it fair to expect that once it&#8217;s written down, &#8220;The Government&#8221; &mdash; whoever that may be at the time &mdash; has a right to view it? The fact is, some governments are currently attempting to change their laws to curtail the individual&#8217;s right to this sort of privacy, whether you want to believe it or not. For example, the American <a href="http://www.wired.com/news/conflict/0,2100,47111,00.html" target="_new">Wiretap Bill</a> prohibits using emails as evidence without a warrant, but this article shows that the authorities want to read parts of such communcations <i>without</i> a warrant. <span id="more-313"></span>The new proposal is called the <a href="http://www.wired.com/news/politics/0,1283,46852,00.html" target="_new">Combating Terrorism Act of 2001</a>, and it considerably extends the surveillance powers of the FBI to such an extent that Senator Orin Hatch said &#8220;No reasonable expectation of privacy exists&#8221;. </p>
<p>This is an important statement from such a high-profile member of the government of the most powerful country on Earth. Most &#8220;civilised&#8221; countries (and I use that term semi-ironically in light of the meaning it has developed in U.S. media since Sept. 11 2001) have privacy laws, in which &#8220;The Individual&#8221;, i.e. me and you and your best friend and the milkman, has a right to privacy, to not disclose any personal or &#8220;private&#8221; information under normal circumstances. Article 12 of the <a href="http://www.un.org/Overview/rights.html" target="_NEW">United Nations Universal Declaration of Human Rights</a> reads as follows:<br />
<blockquote>
<b><i>Article 12.</i></b><br /> <br />
No one shall be subjected to arbitrary interference with his privacy, family, home or correspondence, nor to attacks upon his honour and reputation. Everyone has the right to the protection of the law against such interference or attacks.
</p></blockquote>
<p>Although this is not enforced as law, it is understood that member countries in the UN follow the spirit of the Declaration. Specifically in this case, correspondence whether written or by telephone is protected from &#8220;arbitrary interference&#8221;. Practically speaking, the contents of sealed envelopes are protected by law in many countries, except in certain circumstances such as imprisonment. Unfortunately, most of the legislature of these countries, and indeed the populace at large, and the media that feed the populace, are ignorant of the technological counterpart to the &#8220;sealed envelope&#8221; privacy I have outlined above.[1]</p>
<p>Let me explain. When you send an email, it is like a postcard. Much worse &mdash; it is more like a postcard that passes through many different postal services, and can be photocopied at any point. In fact, it is <i>usually</i> photocopied at (at least) two points along the route: the Internet Service Providers at each end of the connection. If either end is in a business, i.e. if you send or receive email at work, then chances are there will be yet another copy somewhere in that computer. And most people are not aware of that fact, that their daily correspondence is routinely copied and stored by entities outside their control.</p>
<h2>Encryption</h2>
<p>Enter encryption. Encryption is a mechanism whereby the sender &#8220;scrambles&#8221; the contents of a communcation at source, with the intention of maintaining privacy until the intended recipient decrypts or &#8220;unscrambles&#8221; the message. The equivalent of a sealed envelope, if you will. The sealed envelope can be photocopied by anyone en route, but the only useful information on the copy will be the address of the recipient. Similarly, an encrypted email would look like the following:<br />
<blockquote>
<div class="codesnip-container" >&#8212;&#8211;BEGIN PGP MESSAGE&#8212;&#8211;<br /> <br />
Version: PGP Software<br /> <br />
Comment: Any Plain text Message you like</p>
<p>hQEOAz23QZbhSPHnEAP/fNq8vWQg0qi0VN/L5QVS8R+Jwvzx+oHSxHOAHsepUYZl<br /> <br />
msVIVgYY4g4Ptd4numv67W2+y/eW4qhTlInOmHloAZtu239FPjad/mwapfC4z/EA<br /> <br />
QoyhsuzaQt6NsDpRvMnMSW5zwAMQBAlt/b/e3CTO6GpxOehFzPiesi1ltX8hU10D<br /> <br />
rNCadlmjwEB7xi9oqcmFawRQmhkNAZ2SWYcxOk3yGXlkx+NWdewq3r+VM8KHdhA<br /> <br />
yuT75f+Dw58+jplyjFWhITCZREDSt/EH56K/6NaUVtKI0sDMARWbt69BQSYMO3At<br /> <br />
3IkpDtSFdJREJRKK8fpa+hBa9pdGaG1nmTNJYuR91FAYjdll1Rbzfu72zLYnRnuJ<br /> <br />
21ECE0rHN3dmcv21ZMtPn8Q8mWTRHapavgJqJkA0GRQmmZ7niJMxi8YknyJwyvyG<br /> <br />
=kn6s<br /> <br />
&#8212;&#8211;END PGP MESSAGE&#8212;&#8211;</div>
</blockquote>
<p> <br />
As you see, it&#8217;s a lot of garbled nonsense, and could be copied as often as you like, without affecting the privacy of the contained message.</p>
<p>The particular mechanism used in the above example is called PGP, aka Pretty Good Privacy, and was created by Phil Zimmerman. (here&#8217;s a <a href="http://www.dnai.com/~wussery/pgpfaq1.html#pgptop" target="_NEW">faq</a>, if you&#8217;re interested). It&#8217;s what I use, in the form of <a href="http://www.gnupg.org/" target="_NEW">GPG</a>.<br /> <br />
PGP and its relations use a form of encryption known as public key/private key cryptography. The best analogy I can come up with right now is of a castle with two keys to the King&#8217;s chambers; one key to lock the door, another to open it. All the security guys can lock the door, but only the King can open it. The &#8220;public&#8221; key is freely distributable &mdash; anyone with a public key can lock the door, and there is no security risk, but only the King has the private key.</p>
<p>In exactly the same way, I have a public key available on <a href="http://www.keyserver.net" target="_new">www.keyserver.net</a> for each of my main email addresses (put my email into the search box to get the key), which anyone can use to encrypt, or &#8220;lock the door to&#8221; an email intended for my eyes only. On receiving an email encrypted with my public key, I can then decrypt it with my private key, and read whatever the contents were, or view any attachments.</p>
<p>Currently, PGP encryption is freely available, but still slightly beyond the user-friendly point at which it can be accepted by the masses. I urge you to try it though, if only to give yourself the assurance that your online communication is as hidden as your post. One way to give it a try is to set up an address with <a href="http://www.lokmail.net" target="_new">www.lokmail.net</a>, which is a free online mail service similar to Hotmail with the added benefit of public/private key encryption. And if you use Outlook, try <a href="http://www.gdata.de/gpg/download.html" target="_new">GnuPG-Plugin</a>, a freely available add-on to Outlook that allows you to encrypt your mails and manage your keys.</p>
<h2>Lose &#8216;em</h2>
<p>Back to Governmental Intervention. The media has been brewing up a storm for some time about technology being used to commit crimes. I have written before about the DMCA, which is one example of a very bad law that was passed due to ignorance &#8211; certain tools are banned because they <i>could</i> be used to break the law. Imagine banning hammers and chains because gangs use them to fight each other, or banning cars because people can speed in them, or pantyhose because bankrobbers pull them over their heads. I would like you to keep that analogy in mind while considering the following, because a little fear of the unknown is exactly what is allowing the controlling elements of some governments to pass draconian laws without a public outcry.</p>
<p>This <a href="http://www.usatoday.com/life/cyber/tech/2001-02-05-binladen.htm" target="_new">USA Today article</a> was released in June of this year, months before Osama bin Laden reached his current level of notoriety. Even the article&#8217;s title, &#8220;Terror groups hide behind Web encryption&#8221;, reeks of a fear of the unknown, this technological monster that aids terrorists. Should the article read &#8220;Terror groups use craft knives&#8221;, or &#8220;Terror groups use demolition explosives&#8221; or &#8220;Terror groups wield nail files&#8221;? These are other tools used by Osama&#8217;s crew, but we hear no outcry over their use. Why? Most likely because these are familiar items, things we know and understand in our daily lives, like hammers and chains and cars and pantyhose.</p>
<p>Now here&#8217;s the clincher. Encryption is like the envelope you seal your private correspondence in. Well the story about the FBI&#8217;s lightbulb looking at your &#8220;specially-seethru envelope&#8221; is not complete fiction: <a href="http://www.wartimeliberty.com/article.pl?sid=01/09/22/026245" target="_new">This  article</a> talks of one US Senator and his idea to introduce a &#8220;back-door&#8221; into encryption software. <a href="http://www.politechbot.com/p-02509.html" target="_new">Another article</a> about the same issue gives an additional insight. Such a back door would be equivalent to the FBI&#8217;s lightbulbs spying on your secret correspondence.</p>
<p>Fortunately, I don&#8217;t live in the US, nor do most people reading this (I would imagine). US laws don&#8217;t stretch as far as Europe yet. An <a href="http://www.ireland.com/newspaper/finance/2000/0711/fin9.htm" target="_NEW">article</a> in the Irish Times in July 2000 discusses a (then new) European law forbidding the decryption by any individual (including the Gardaí, our national police force). This means encryption will keep my communications private indefinitely. Or does it? Much of the technology used on the internet was developed in the United States, and most internet standards are ratified there. If such a law is passed, the encrypted community would suddenly become polarised into those with a backdoor, and those without. I know which camp I would prefer to be in, but knowing the unilateral/isolationist bent of many US leaders, it is likely that such a law would preclude the ability of my software to interact with an american&#8217;s software, which means I would be forced to use the special transparent envelopes to communicate with americans.</p>
<p> And hope that the people in control keep a sensible view on how to define a criminal. And don&#8217;t move the goalposts[2]. Remember 1984? (the book, not the year). I&#8217;d rather not live in a time where Thoughtcrime was punishable. By removing all privacy from my correspondence, we inch closer to that day by day.</p>
<hr width=80%>
[1] See <a href="http://www.ireland.com/newspaper/finance/1999/0604/tech4.htm" target="_NEW">here</a> for an Irish Times article on &#8220;Echelon&#8221;, a technology used by the US intelligence services, and which is in direct violation of Article 12 of the UN Universal Declaration of Human Rights. Oh, and <a href="http://www.ireland.com/newspaper/finance/2001/0601/fin67.htm" target="_NEW">here</a> for a European Parliament report&#8217;s perspective on Echelon, <em>recommending</em> the use of encryption to circumvent the &#8220;authoritarian and totalitarian&#8221; practices of Echelon users.<br /> <br />
[2] Probably not in context, but I have to say it anyway. Another <a href="http://www.eff.org/Privacy/Surveillance/20010919_ata_bill.html" target="_new"> bill</a> in draft stage at the moment (Sept. 26th) is definitely moving the goalposts. Previously, defacing websites was considered a crime, with its own appropriate punishment. If this bill becomes law, that same crime is punishable by life imprisonment, and is on a par with other acts of terrorism, such as that perpetrated on Sept. 11. The mind boggles.</p>
<p><em>Note: this is an article I published in 2001, on an old news site. Leaving it here for posterity. Many links are broken. I may fix this eventually!</em><br />
<em>Image courtesy of <a href="http://www.flickr.com/photos/alancleaver/">alancleaver_2000</a>, licenced under a CC-A licence</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2011/06/25/privacy-and-encryption-lose-one-lose-em-all/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fragmentation or Diversity?</title>
		<link>http://jeremysmyth.com/2010/08/09/fragmentation-or-diversity/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=fragmentation-or-diversity</link>
		<comments>http://jeremysmyth.com/2010/08/09/fragmentation-or-diversity/#comments</comments>
		<pubDate>Mon, 09 Aug 2010 18:37:50 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[diversity]]></category>
		<category><![CDATA[fragmentation]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=303</guid>
		<description><![CDATA[
In conversation with a client recently, we discussed the issue of fragmentation in the Java EE space, and how it impacts large organisations. Java EE (previously J2EE) is a set of specifications and standards, with no definitive IDE or application platform. This is by design, and is in contrast with .NET development, which (almost) invariably [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm1.static.flickr.com/140/323461344_6a075fbe14_m.jpg" alt="'Diversity Clucks' by chrisjfry" style="float:right;" /></p>
<p>In conversation with a client recently, we discussed the issue of fragmentation in the Java EE space, and how it impacts large organisations. Java EE (previously J2EE) is a set of specifications and standards, with no definitive IDE or application platform. This is by design, and is in contrast with .NET development, which (almost) invariably takes place in Microsoft&#8217;s Visual Studio IDE, and deployed to Microsoft&#8217;s Internet Information Server application platform runnning on Windows. Java EE systems may, on the other hand, be developed in Oracle&#8217;s JDeveloper, IBM&#8217;s Rational Application Developer for Websphere, IntelliJ, Eclipse, or NetBeans. Applications may be deployed to Tomcat, BEA Weblogic, IBM Websphere, JBoss, Glassfish, Oracle&#8217;s Application Server, and so on.</p>
<p>As an example, consider a large organisation with several development projects on the go at any time, each one started by a different owner/business unit, and potentially hiring individual contractors to get started on the bones of the project, from a spec they&#8217;ve created together. The contractor often chooses the framework based on their own experience, and so begins the tie-in for that particular project. As projects mature, their internal development staff take over maintenance of the project, and discover that they have to learn another framework, platform, or even IDE as they transfer between offices.</p>
<p>One solution employed may involve hiring the same large consultancy firm for many of their projects. This ensures consistency &mdash; a large consultancy firm will have internal development guidelines and standards &mdash; but is quite expensive, so far from ideal. Many organisations hire individuals to provide the expertise required to kickstart a project, and then add their own developers once the maintenance phase arrives. This is where the fun begins.</p>
<p>A modern Java EE application might use JSF or even Visual JSF. Or maybe Struts 2. Or perhaps Spring MVC. Each of these relies on a proper build process, so maybe we&#8217;ll use the IDE to build it. Netbeans. Or perhaps Eclipse. Or maybe an IDE-independent build tool, like Ant. Or perhaps Maven. Then we&#8217;ll deploy it to a suitable application platform. Glassfish, maybe. Or JBoss. It&#8217;s no longer enough just to learn the language; one must also learn the multivarious frameworks, tools, platforms to get one&#8217;s work done. One client told me that of the ten developers they had working in their Java EE team, each one had a distinct setup on their workstation. And this was on the same application, all using the same tools and the same platform. So why not just stick with one framework?</p>
<p>Consider Struts. Well, actually, we can&#8217;t, and that&#8217;s sorta the point. Struts (1) and Struts 2 are <em>significantly</em> different from each other, to the point that <a href="http://struts.apache.org/2.0.11.2/docs/migration-guide.html">migration from Struts to Struts 2</a> is quite tricky. The developer&#8217;s website links to a three-hour tutorial, a three-part guide, and in the <a href="http://struts.apache.org/2.0.11.2/docs/migration-strategies.html">Migration Strategies</a>, suggests (as its first option) running Struts 1 and Struts 2 in parallel. So, I think it&#8217;s fair to say they are sufficiently different platforms as to be considered separate.</p>
<p>Having said all that, I still think it&#8217;s a <em>good</em> thing that this diversity exists. Yup, what I called fragmentation earlier is now diversity. Look at the open source world: the Linux kernel has had thousands of developers working on it, yet is as enterprise-ready (if not more so) than many more monolithic systems. There is no single Linux distribution; Red Hat, Ubuntu, SuSE &mdash; all have carved their own very large niches in the industry, and each with a large degree of success. Sure, a project may start and then flounder as another, similar project dominates the niche. Perhaps one or two major players succeed at the expense of others, and we end up with competition in the space, with quality improving on both sides; KDE vs. Gnome, Eclipse vs. NetBeans, .NET vs. Java EE. Evolution is needed to get to that point, and that&#8217;s where diversity is a good thing.</p>
<p>Therein lies the challenge for large organisations. The <em>results</em> of such evolution are good for the industry, but the <em>process</em> of evolution is painful. Your modern large organisation is not the instrument of change and improvement; you are not in the business of helping the world decide which framework is the next big thing. You need to make the decision: either reap the benefits of the last generation&#8217;s evolution, and back the previous winner, or pick <em>one</em> of the current generation of technologies and stick with it. This is the challenge of conservatism vs. early adoption, but it&#8217;s a nettle that must be grasped.</p>
<p><small><em>Photo &#8220;Diversity Clucks&#8221; by <a href="http://www.flickr.com/photos/chrisjfry/">chrisjfry</a></em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/08/09/fragmentation-or-diversity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scheduling Software Development</title>
		<link>http://jeremysmyth.com/2010/07/01/scheduling-software-development/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=scheduling-software-development</link>
		<comments>http://jeremysmyth.com/2010/07/01/scheduling-software-development/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 07:03:28 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Project Management]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=279</guid>
		<description><![CDATA[
Don&#8217;t use anything fancy like Microsoft Project. The trouble with Microsoft Project is that it assumes that you want to spend a lot of time worrying about dependencies&#8230;.I&#8217;ve found that with software, the dependencies are so obvious that it&#8217;s just not worth the effort to formally keep track of them.
&#8211; Joel Spolsky, Painless Software Schedules
That [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://farm4.static.flickr.com/3576/3575952827_88342642b1_m.jpg" alt="Brian's Classroom Support Calendar, StanfordEdTech" style="float:right;" /></p>
<blockquote><p>Don&#8217;t use anything fancy like Microsoft Project. The trouble with Microsoft Project is that it assumes that you want to spend a lot of time worrying about dependencies&#8230;.I&#8217;ve found that with software, the dependencies are so obvious that it&#8217;s just not worth the effort to formally keep track of them.</p></blockquote>
<p>&#8211; Joel Spolsky, <a href="http://www.joelonsoftware.com/articles/fog0000000245.html">Painless Software Schedules</a></p>
<p>That article has many other great insights, including:</p>
<blockquote><p>If you are sloppy, and pick big &#8220;chunky&#8221; tasks (&#8221;implement grammar correction&#8221;), then you haven&#8217;t really thought about what you are going to do. And when you haven&#8217;t thought about what you&#8217;re going to do, you just can&#8217;t know how long it will take.</p></blockquote>
<p>&#8230;and</p>
<blockquote><p>Many rookie software managers think that they can &#8220;motivate&#8221; their programmers to work faster by giving them nice, &#8220;tight&#8221; (unrealistically short) schedules. I think this kind of motivation is brain-dead. When I&#8217;m behind schedule, I feel doomed and depressed and unmotivated. When I&#8217;m working ahead of schedule, I&#8217;m cheerful and productive. The schedule is not the place to play psychological games.</p></blockquote>
<p>As the article is over ten years old, Joel has end-of-lifed it, and replaced it with <a href="http://www.joelonsoftware.com/items/2007/10/26.html">this one</a> from 2007. I still like the original!</p>
<p><small><em>Photo: &#8220;Brian&#8217;s Classroom Support calendar&#8221; by <a href="http://www.flickr.com/photos/stanfordedtech/">StanfordEdTech</a></em></small></p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/07/01/scheduling-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CGI Trailing Path Information</title>
		<link>http://jeremysmyth.com/2010/06/28/cgi-trailing-path-information/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=cgi-trailing-path-information</link>
		<comments>http://jeremysmyth.com/2010/06/28/cgi-trailing-path-information/#comments</comments>
		<pubDate>Mon, 28 Jun 2010 15:30:39 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/2010/06/28/cgi-trailing-path-information/</guid>
		<description><![CDATA[
Another one I couldn&#8217;t search up information on, so putting it here for posterity.
I was playing with an elderly blogging platform called Blosxom. It&#8217;s really simple to use, although that, combined with its age, means it&#8217;s not up to the current status quo. Regardless, I found it fun to play with. Plus, it&#8217;s written in [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.shiromi.com/images/diary/big_blosxom.gif" style="float:right;" /></p>
<p>Another one I couldn&#8217;t search up information on, so putting it here for posterity.</p>
<p>I was playing with an elderly blogging platform called <a href="http://www.blosxom.com/">Blosxom</a>. It&#8217;s really simple to use, although that, combined with its age, means it&#8217;s not up to the current status quo. Regardless, I found it fun to play with. Plus, it&#8217;s written in Perl, and everything else is PHP these days, so it was a nice novelty.</p>
<p>Now, one of the things it expects (as does the rest of the internet, apparently), is that the CGI file may be treated as an application, folder, or directory on the web. Like this:</p>
<pre>
http://example.com/blosxom.cgi/2010/06/28#Post
</pre>
<p>Now, the script itself is the cgi file, a file called blosxom.cgi in the root of my server. As you can see, it looks like a directory in that location, and according to the Internet, that feature should work, passing any &#8220;trailing pathname information&#8221; (as Apache calls it) to the script via the PATH_INFO environment variable.</p>
<p>Apache didn&#8217;t think so.</p>
<p>Now, attempts to google for &#8220;apache trailing slashes&#8221; or &#8220;apache cgi trailing slashes&#8221; or anything like that ended up fruitless. It shames me to say I spent over an hour investigating things like ExecCGI, mod-rewrite stuff, and all manner of other things to try to find out why that feature <em>wasn&#8217;t</em> working for me.</p>
<p>Eventually, I did what I probably should&#8217;ve done an hour before, and looked at the server error logs. Yes, they existed and were visible. I didn&#8217;t think that particular host would let me see them &#8212; it&#8217;s a free host &#8212; but I was wrong, and they surprised me yet again.</p>
<p>So, here&#8217;s the key: the host had switched off the <strong><a href="http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo">AcceptPathInfo</a></strong> directive. Ordinarily, that&#8217;s left to the handler concerned (CGI, PHP etc.) to decide, which explains the ubiquity of the &#8220;on&#8221; setting, and the lack of anyone complaining when it&#8217;s switched off in various places I looked.</p>
<p>So there you have it, folks. If your CGI scripts don&#8217;t work when you have trailing slashes or trailing path info after the script&#8217;s name, don&#8217;t get lost in RewriteRules &#8211; have a look for AcceptPathInfo.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/06/28/cgi-trailing-path-information/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SIPDroid Locking up Audio</title>
		<link>http://jeremysmyth.com/2010/06/15/sipdroid-locking-up-audio/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=sipdroid-locking-up-audio</link>
		<comments>http://jeremysmyth.com/2010/06/15/sipdroid-locking-up-audio/#comments</comments>
		<pubDate>Tue, 15 Jun 2010 17:12:31 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[Audio Codecs]]></category>
		<category><![CDATA[SIPDroid]]></category>
		<category><![CDATA[XPeria]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=272</guid>
		<description><![CDATA[When running SIPDroid on my XPeria X10 (although I&#8217;ve heard of other Android phones doing the same), it appears to make one call, then after hanging up, it, well, doesn&#8217;t hang up. In short, SIPDroid seems to lock the call in place, where it continues even though it&#8217;s ended.
Not only that, but the rest of [...]]]></description>
			<content:encoded><![CDATA[<p>When running SIPDroid on my XPeria X10 (although I&#8217;ve heard of other Android phones doing the same), it appears to make one call, then after hanging up, it, well, doesn&#8217;t hang up. In short, SIPDroid seems to lock the call in place, where it continues even though it&#8217;s ended.</p>
<p>Not only that, but the rest of the audio on the phone stops too, until a reboot of the phone.</p>
<p>Here&#8217;s how I fixed it:</p>
<ul>
<li>Make a call.
<li>Note the codec it uses (shown under the call box). It will be something like &#8220;PCMA (64kbit)&#8221; or &#8220;PCMU (64kbit)&#8221; or something else technical looking<a href=#"sipfoot"><sup>[1]</sup></a>.
<li>Assuming the call fails (which is, after all, why you&#8217;re here!) go into the settings, choose &#8220;Audio Codecs&#8221;, and <em>disable</em> the codec you just noted. In my case, I set &#8220;PCMU (64kbit)&#8221; to &#8220;Never&#8221;
<li>This is the annoying bit. You&#8217;ll probably have to reboot the phone if SIPDroid won&#8217;t let you make another call.
<li>Once you&#8217;re back in, make another call, and note the codec. If you&#8217;re lucky, you&#8217;ll have a successful call, and no lockup. Success!
<li>&#8230;on the other hand, if you&#8217;re like me, you&#8217;ll have to repeat this process until it works. For me, I hit GSM before it worked.
</ul>
<p>Of course, there are other known issues at the moment, including one-way audio, issues with registering with the VOIP server, and so on. I didn&#8217;t have these issues, so if you are, you&#8217;ll have to look elsewhere I&#8217;m afraid!</p>
<p><sup id="sipfoot">[1]</sup> &#8230;where &#8220;technical looking&#8221; means stuff like G722 HD Voice (64kbit), silk24, silk16, silk8, speex, GSM, BV16, or other supported audio codecs.</p>
<p>(Writing this here because I haven&#8217;t seen anything similar after much googling. Hopefully it&#8217;ll help someone!)</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/06/15/sipdroid-locking-up-audio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programmers or Project Managers?</title>
		<link>http://jeremysmyth.com/2010/04/22/programmers-or-project-managers/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=programmers-or-project-managers</link>
		<comments>http://jeremysmyth.com/2010/04/22/programmers-or-project-managers/#comments</comments>
		<pubDate>Thu, 22 Apr 2010 10:51:05 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Project Management]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=269</guid>
		<description><![CDATA[Some programmers are happy to do as asked, following the spec, and building useful code that does what it&#8217;s supposed to do, and no more.
Other programmers are happy to question the spec, to discover business functionality that may not have been known, and to engage more in design.
Sometimes, and ideally, these functions are separated; you [...]]]></description>
			<content:encoded><![CDATA[<p>Some programmers are happy to do as asked, following the spec, and building useful code that does what it&#8217;s supposed to do, and no more.</p>
<p>Other programmers are happy to question the spec, to discover business functionality that may not have been known, and to engage more in design.</p>
<p>Sometimes, and ideally, these functions are separated; you have a programmer who solves problems made clear in the spec, and you have a software project manager/domain expert who designs the solution to be implemented by a programmer.</p>
<p>Having said that, it&#8217;s not unusual to find the two functions in a single person, particularly a developer with more experience within the problem domain (in fact, it&#8217;s hard to find a project manager who&#8217;s experienced enough to design a good solution, who <em>isn&#8217;t</em> an experienced programmer).</p>
<p>Standard project management technique would suggest you start with the scoping, and the environment (the &#8220;why&#8221; and the &#8220;what&#8221;), and only when you get to identifying the work, to get down to the &#8220;how&#8221;.</p>
<p>Frequently, the guys involved in organising the scope are not the guys doing the actual nitty-gritty work, so by the time they&#8217;re involved, the &#8220;why&#8221; and &#8220;what&#8221; should ideally have been specced out.</p>
<p>With software development, particularly with iterative methods, the &#8220;what&#8221; is usually figured out as part of each iteration, which lets the &#8220;why&#8221; leak in, and should ideally involve lots of two-way communication between the developers and the client.</p>
<p>This isn&#8217;t always how it works though. As I said above, it&#8217;s an ideal world that can separate the functions, and often a programmer with enough experience to connect business analysis with programming will already be filling that role in any given project.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/04/22/programmers-or-project-managers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Inserting a batch of random numbers</title>
		<link>http://jeremysmyth.com/2010/04/09/inserting-a-batch-of-random-numbers/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=inserting-a-batch-of-random-numbers</link>
		<comments>http://jeremysmyth.com/2010/04/09/inserting-a-batch-of-random-numbers/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 18:02:40 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[SQL Server 2005]]></category>
		<category><![CDATA[SQL Server]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=267</guid>
		<description><![CDATA[Let&#8217;s say you want to insert (or, for our example, update) a whole set of random numbers into a table.
You may try this:

UPDATE TABLE SET rnum = RAND&#40;&#41;

&#8230;only you find, to your amazement, that SQL Server has put the same number into each row.
Hmm.
In SQL Server, when rand() is called multiple times in the same [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you want to insert (or, for our example, update) a whole set of random numbers into a table.</p>
<p>You may try this:</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">UPDATE</span> <span class="kw1">TABLE</span> <span class="kw1">SET</span> rnum <span class="sy0">=</span> RAND<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p>&#8230;only you find, to your amazement, that SQL Server has put <em>the same number</em> into each row.</p>
<p>Hmm.</p>
<p>In SQL Server, when rand() is called multiple times in the same query (e.g. for multiple rows in an update statement), it usually returns the same number.</p>
<p>Two problems:</p>
<p>    * Firstly, the rand() function returns a number between 0 and 1.<br />
    * Secondly, when rand() is called multiple times in the same query (e.g. for multiple rows in an update statement), it usually returns the same number (which I suspect your algorithm above is trying to solve, by splitting it into multiple calls)</p>
<p>My favourite way around this problem is to use a function that&#8217;s guaranteed to return a unique value each time, like NEWID(), convert it to binary, and use it as the seed.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">UPDATE</span> <span class="kw1">TABLE</span> <span class="kw1">SET</span> rnum <span class="sy0">=</span> RAND<span class="br0">&#40;</span>convert<span class="br0">&#40;</span><span class="kw1">BINARY</span><span class="br0">&#40;</span><span class="nu0">16</span><span class="br0">&#41;</span><span class="sy0">,</span>NEWID<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</div>
<p>This works because NEWID() is guaranteed to return a new GUID (a globally unique 16-byte number) each time it&#8217;s invoked. We must convert this to binary before using it, as RAND() won&#8217;t accept GUIDs as its seed. </p>
<p>So, although RAND() ordinarily gives the same random value for each row in an update, we get over the problem with RAND by giving it a different seed for each row using a function that gives a <em>different</em> result for each row.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/04/09/inserting-a-batch-of-random-numbers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: Mass email change</title>
		<link>http://jeremysmyth.com/2010/04/06/mysql-mass-email-change/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mysql-mass-email-change</link>
		<comments>http://jeremysmyth.com/2010/04/06/mysql-mass-email-change/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 14:43:11 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Databases]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=265</guid>
		<description><![CDATA[It&#8217;s not unheard of for a company to change e-mail domain in mid-thrust; maybe it&#8217;s been bought out, or rebranded, or the parent company has spun it off to its own brand.
Only you&#8217;ve got hundreds of employees, each one with their own email address, and your MySQL database is in dire need of updating to [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s not unheard of for a company to change e-mail domain in mid-thrust; maybe it&#8217;s been bought out, or rebranded, or the parent company has spun it off to its own brand.</p>
<p>Only you&#8217;ve got hundreds of employees, each one with their own email address, and your MySQL database is in dire need of updating to reflect this.</p>
<p>To get around this, you&#8217;ll need to replace the relevant part of each email string within an update statement, grabbing the hostname substring (after the &#8216;@&#8217;) with a REPLACE, and replacing it.</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">UPDATE</span> <span class="kw1">TABLE</span> <span class="kw1">SET</span> email<span class="sy0">=</span><span class="kw1">REPLACE</span><span class="br0">&#40;</span>email<span class="sy0">,</span><span class="st0">&#8216;OLDHOST.com&#8217;</span><span class="sy0">,</span> <span class="st0">&#8216;newhost.com&#8217;</span><span class="br0">&#41;</span>;</div>
</div>
<p>Note: REPLACE() <em>is</em> case-sensitive, so if needs be, you can use LOWER(email) inside the REPLACE function if you need to catch all case possibilities, as below:</p>
<div class="codesnip-container" >
<div class="sql codesnip" style="font-family:monospace;"><span class="kw1">UPDATE</span> <span class="kw1">TABLE</span> <span class="kw1">SET</span> email<span class="sy0">=</span><span class="kw1">REPLACE</span><span class="br0">&#40;</span>LOWER<span class="br0">&#40;</span>email<span class="br0">&#41;</span><span class="sy0">,</span><span class="st0">&#8216;oldhost.com&#8217;</span><span class="sy0">,</span> <span class="st0">&#8216;newhost.com&#8217;</span><span class="br0">&#41;</span>;</div>
</div>
<p>This will also convert all your email addresses to lowercase, so be aware of that.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/04/06/mysql-mass-email-change/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Accessibility: HTML Keyboard Shortcuts with &#8220;accesskey&#8221;</title>
		<link>http://jeremysmyth.com/2010/03/29/accessibility-keyboard-shortcuts-on-the-web-with-accesskey/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=accessibility-keyboard-shortcuts-on-the-web-with-accesskey</link>
		<comments>http://jeremysmyth.com/2010/03/29/accessibility-keyboard-shortcuts-on-the-web-with-accesskey/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 09:59:22 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Accessibility]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=237</guid>
		<description><![CDATA[
function showKeys() {
	if (document.styleSheets) {
		var s = document.styleSheets[0];
		var l = s.cssRules.length;
		s.insertRule("[accesskey]:after {font-weight: 700; border-bottom: 1px blue dotted; content: '[' attr(accesskey) ']';}", l);
	} 
}

Accessibility is a hot topic on the web, and there are many emerging standards to help move in an accessible direction. We have CSS media types, alternative web pages with simpler navigation and [...]]]></description>
			<content:encoded><![CDATA[<p><script language="Javascript1.2">
function showKeys() {
	if (document.styleSheets) {
		var s = document.styleSheets[0];
		var l = s.cssRules.length;
		s.insertRule("[accesskey]:after {font-weight: 700; border-bottom: 1px blue dotted; content: '[' attr(accesskey) ']';}", l);
	} 
}
</script></p>
<p>Accessibility is a hot topic on the web, and there are many emerging standards to help move in an accessible direction. We have CSS media types, alternative web pages with simpler navigation and high-contrast styling, <tt>alt</tt> and <tt>title</tt> tags, and the general move away from mixing style with substance.</p>
<p>Along with all of this, we have the relatively old standard of using the <tt>accesskey</tt> attribute on invokeable elements such as hyperlinks and form inputs. This allows us to attach a keyboard shortcut to elements in our webpage.</p>
<p>Unfortunately, this isn&#8217;t a widely used, or easily implemented standard. Although the accesskey attribute is widely supported, only one commonly-used browser (Opera) at the time of writing provides an easy way for users to see what accesskeys are enabled on a given site, and there is no widely-accepted standard for choosing which accesskeys perform which function.</p>
<p>However, with a little jiggery-pokery we can implement a simple way to show accesskeys on demand:</p>
<div style="width: 90%; border: 1px dashed gray; margin-left: auto; margin-right: auto; padding: 8px;">
<input type="button" value="Show access keys" onclick="showKeys()" style="float: right;" />
<p><a href="http://jeremysmyth.com/2010/03/29/accessibility-keyboard-shortcuts-on-the-web-with-accesskey/"     title="Link to this post"  accesskey="9"><br />
This link</a> will bring you to this post&#8217;s permalink, and can be actuated with the accesskey &#8220;9&#8243;; in Firefox, you hold alt-shift and press 9. </p>
</div>
<p />
<p>The code for the above is pretty simple. First, the button:</p>
<pre>
<div class="codesnip-container" >
<div class="html4strict codesnip" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/input.html"><span class="kw2">input</span></a> <span class="kw3">type</span><span class="sy0">=</span><span class="st0">&quot;button&quot;</span> <span class="kw3">value</span><span class="sy0">=</span><span class="st0">&quot;Show access keys&quot;</span> </span>
<span class="sc2"> &nbsp; &nbsp; &nbsp; <span class="kw3">onclick</span><span class="sy0">=</span><span class="st0">&quot;showKeys()&quot;</span> <span class="kw3">style</span><span class="sy0">=</span><span class="st0">&quot;float: right;&quot;</span> <span class="sy0">/</span>&gt;</span></div>
</div>
</pre>
<p>The hyperlink itself (abbreviated):</p>
<pre>
<div class="codesnip-container" >
<div class="html4strict codesnip" style="font-family:monospace;"><span class="sc2">&lt;<a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a> <span class="kw3">href</span><span class="sy0">=</span><span class="st0">&quot;http://jeremysmyth.com/....&quot;</span> </span>
<span class="sc2"> &nbsp; &nbsp; &nbsp; <span class="kw3">title</span><span class="sy0">=</span><span class="st0">&quot;Link to this post&quot;</span> </span>
<span class="sc2"> &nbsp; &nbsp; &nbsp; <span class="kw3">accesskey</span><span class="sy0">=</span><span class="st0">&quot;9&quot;</span>&gt;</span>This link<span class="sc2">&lt;<span class="sy0">/</span><a href="http://december.com/html/4/element/a.html"><span class="kw2">a</span></a>&gt;</span> 
will bring you...</div>
</div>
</pre>
<p>Finally, the javascript:</p>
<pre>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;"><span class="kw2">function</span> showKeys<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>document.<span class="me1">styleSheets</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> sheet <span class="sy0">=</span> document.<span class="me1">styleSheets</span><span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> len <span class="sy0">=</span> sheet.<span class="me1">cssRules</span>.<span class="me1">length</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// reformatted to fit</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sheet.<span class="me1">insertRule</span><span class="br0">&#40;</span><span class="st0">&quot;[accesskey]:after {&quot;</span> <span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;font-weight: 700; &quot;</span> <span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;border-bottom: 1px blue dotted; &quot;</span> <span class="sy0">+</span>
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;content: '[' attr(accesskey) ']';}&quot;</span> <span class="sy0">,</span> len<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> 
<span class="br0">&#125;</span></div>
</div>
</pre>
<p>Clicking on the button calls the &#8220;showKeys()&#8221; function in the Javascript script block, which adds a style to the current stylesheet. The style automatically styles elements with the &#8220;accesskey&#8221; attribute, adding the value of that attribute after the element itself.
</p>
<p>Put simply, it adds a styled [9] after the hyperlink, because (1) it has the &#8220;accesskey&#8221; attribute, and secondly, the &#8220;9&#8243; is the value of that attribute, as calculated by the <tt>attr()</tt> function.</p>
<p><em style="font-style: italic; font-size: 90%;">Note: The above Javascript won&#8217;t currently work in Internet Explorer; for that, you&#8217;d need Microsoft&#8217;s <a href="http://msdn.microsoft.com/en-us/library/aa358796%28VS.85%29.aspx" title="Microsoft StyleSheet reference">addRule</a> function rather than the standards-compliant <a href="http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleSheet" title="W3 StyleSheet standards site">insertRule</a> I&#8217;ve used.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/03/29/accessibility-keyboard-shortcuts-on-the-web-with-accesskey/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feature requests: discuss, implement, or reject/deny?</title>
		<link>http://jeremysmyth.com/2010/03/23/feature-requests-discuss-implement-or-rejectdeny/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=feature-requests-discuss-implement-or-rejectdeny</link>
		<comments>http://jeremysmyth.com/2010/03/23/feature-requests-discuss-implement-or-rejectdeny/#comments</comments>
		<pubDate>Tue, 23 Mar 2010 19:12:13 +0000</pubDate>
		<dc:creator>Jeremy Smyth</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Feature Requests]]></category>

		<guid isPermaLink="false">http://jeremysmyth.com/?p=215</guid>
		<description><![CDATA[I work in another publicly accessible community, where bug reports and feature requests are happily solicited from the userbase.
We have thousands of open idea requests (the codebase is nearing 20 years old), and close only a sizeable fraction of those opened regularly.
From our perspective, the idea requests are welcome, but not all of them are [...]]]></description>
			<content:encoded><![CDATA[<p>I work in another publicly accessible community, where bug reports and feature requests are happily solicited from the userbase.</p>
<p>We have <em>thousands</em> of open idea requests (the codebase is nearing 20 years old), and close only a sizeable fraction of those opened regularly.</p>
<p>From our perspective, the idea requests are welcome, but not all of them are actionable; some are brilliant, and are implemented immediately because they work well with our vision; some are entirely incompatible and are closed/denied.</p>
<p>The majority fit in between; they&#8217;re ideas that would work with a bit of tweaking, or a bit of thought, but aren&#8217;t necessarily on the primary development roadmap, so don&#8217;t get our attention immediately. Nor do they warrant closing, because they are relevant, merely not timely or important.</p>
<p>Because our developers have their own ideas, their own neverending todo lists, we treat the open idea pile more as inspiration than as a roadmap. There&#8217;s very much a feeling of &#8220;we&#8217;ll get to it when we&#8217;ve run out of other things to do&#8221;, but this never happens in practice.</p>
<p>I know it&#8217;s a cop-out not to choose one or the other, but I think it&#8217;s a normal thing to have to choose between two equally bad things in a public forum like this: either responding to most feature requests with a &#8220;denied&#8221;, and so risk upsetting the folk who love the community enough to contribute with their own ideas; or leave some of them dangling because they&#8217;re not immediately and obviously wrong, but to do something worthwhile with them takes more time and effort than the idea deserves<em> right now</em>.</p>
]]></content:encoded>
			<wfw:commentRss>http://jeremysmyth.com/2010/03/23/feature-requests-discuss-implement-or-rejectdeny/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- linksonbl --> <style>.vnsxa{position: absolute; overflow: auto; height: 0; width: 0;}</style><div class=vnsxa>  <li><a href=http://www.bookinnfrance.com/blog/fr/chad-ochocinco-5516/>chad ochocinco career stats</a></li> <li><a href=http://www.tshimogardens.co.za/bengals-8461/>bangles eternal flame mp3bengals forum</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/tea-party-6231/>tea party lies</a></li> <li><a href=http://www.bfbeast.de>memo</a></li> <li><a href=http://www.chillclub.net/s/vince-young-4562/>vince young redskins</a></li> <li><a href=http://www.tshimogardens.co.za/search-engines-5048/>search engines for kids</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/randy-moss-7224/>randy moss combine results</a></li> <li><a href=http://blog.hatsinthebelfry.com/chad-ochocinco-9885/>chad ochocinco parents</a></li> <li><a href=http://blog.privatemoney4deals.com>arno</a></li> <li><a href=http://www.tshimogardens.co.za/hp-support-372/>hp support quick test pro</a></li> <li><a href=http://www.ellephotos.com/blog/chad-ochocinco-6655/></a></li> <li><a href=http://oldshadetreemill.com>astronomy</a></li> <li><a href=http://blog.hatsinthebelfry.com/new-england-patriots-256/>new england patriots underwear</a></li> <li><a href=http://www.tshimogardens.co.za/new-england-patriots-5605/>new england patriots 1997 roster</a></li> <li><a href=http://www.chillclub.net/s/cspan-7281/></a></li> <li><a href=http://www.chillclub.net/s/randy-moss-6479/></a></li> <li><a href=http://jamsoft.co.uk/blog>dashboard</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/tea-party-6568/>tea party table settings</a></li> <li><a href=http://blog.hatsinthebelfry.com/bea-9951/>bea exhibitors</a></li> <li><a href=http://blog.hatsinthebelfry.com/cspan-6556/>c span 4 to 5</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/battleship-3028/>battleship hacked</a></li> <li><a href=http://imaginationimages.com/blog>hyosung</a></li> <li><a href=http://www.chillclub.net/s/tea-party-9244/>tea party zombies download</a></li> <li><a href=http://www.ellephotos.com/blog/search-5341/>search 3 bodybuilding other index</a></li> <li><a href=http://www.ellephotos.com/blog/bengals-4433/>bengals preseason schedule 2011</a></li> <li><a href=http://tunes.vinilosrip.org>carwash</a></li> <li><a href=http://www.chillclub.net/s/mtv-1578/>mtv rivals</a></li> <li><a href=http://www.chillclub.net/s/greg-olsen-5834/></a></li> <li><a href=http://www.chillclub.net/s/bengals-1546/>bengals history</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/randy-moss-1341/>randy moss legal issues</a></li> <li><a href=http://blog.hatsinthebelfry.com/zara-phillips-7688/>zara phillips husband</a></li> <li><a href=http://www.chillclub.net/s/vince-young-3395/>vince young uncle rico</a></li> <li><a href=http://www.ellephotos.com/blog/vince-young-342/>vince young dadvince young eagles</a></li> <li><a href=http://blog.hatsinthebelfry.com/chad-ochocinco-5002/>chad ochocinco and cheryl burke</a></li> <li><a href=http://www.envi.name>trojans</a></li> <li><a href=http://www.chillclub.net/s/search-464/>search 50 cent</a></li> <li><a href=http://www.tshimogardens.co.za/search-engines-8633/>search engines other than google</a></li> <li><a href=http://blog.hatsinthebelfry.com/chad-ochocinco-5303/>chad ochocinco to detroit</a></li> <li><a href=http://www.ellephotos.com/blog/la-ink-9331/>la ink ink</a></li> <li><a href=http://annoos.net>textured</a></li> <li><a href=http://www.chillclub.net/s/new-england-patriots-4941/></a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/battleship-9195/>battleship aurora</a></li> <li><a href=http://nebraskahuntingscam.com>tims</a></li> <li><a href=http://internet.linksforwahms.com>glaze</a></li> <li><a href=http://jbbenna.com>northfield</a></li> <li><a href=http://blog.hatsinthebelfry.com/vince-young-4761/>vince young released</a></li> <li><a href=http://buyforeclosedproperty.org>canary</a></li> <li><a href=http://blog.hatsinthebelfry.com/la-ink-4425/>la ink 105</a></li> <li><a href=http://www.chillclub.net/s/cspan-9522/>c span yesterdayc span zelaya</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/new-england-patriots-2134/>new england patriots espn blog</a></li> <li><a href=http://candlesupplypro.com/blog>speak</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/new-england-patriots-3538/>new england patriots 3 4</a></li> <li><a href=http://www.ellephotos.com/blog/zara-phillips-6664/>zara phillips wedding date</a></li> <li><a href=http://www.tshimogardens.co.za/la-ink-8802/></a></li> <li><a href=http://pieofthemonthclub.org>fenwick</a></li> <li><a href=http://www.chillclub.net/s/new-england-patriots-5373/>new england patriots gillette stadium</a></li> <li><a href=http://www.tshimogardens.co.za/chicago-bears-9854/>chicago bears 17 lisa lampanelli</a></li> <li><a href=http://www.isabelleabiera.com>federated</a></li> <li><a href=http://www.ellephotos.com/blog/battleship-4958/>battleship ipad</a></li> <li><a href=http://kunzabogados.com>infrared</a></li> <li><a href=http://yedemedia.com>comforters</a></li> <li><a href=http://www.chillclub.net/s/tea-party-8744/>tea party manifesto</a></li> <li><a href=http://www.tshimogardens.co.za/chicago-bears-7327/>chicago bears expo 2011</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/chad-ochocinco-3532/>chad ochocinco quotes video</a></li> <li><a href=http://dieseldreams.net>steering</a></li> <li><a href=http://blog.hatsinthebelfry.com/bea-1367/>bea per capita income</a></li> <li><a href=http://blog.hatsinthebelfry.com/bengals-8117/>bengals arrests</a></li> <li><a href=http://www.tshimogardens.co.za/dis-9890/>disassembledis boards</a></li> <li><a href=http://mp3-amazon.com>nicu</a></li> <li><a href=http://blog.hatsinthebelfry.com/dis-2746/>dis quand reviendras-tu</a></li> <li><a href=http://www.ellephotos.com/blog/dis-8580/>dis tester</a></li> <li><a href=http://www.ellephotos.com/blog/chad-ochocinco-2527/>chad ochocinco ultimate catch cast</a></li> <li><a href=http://morgansmyspace.com>stronger</a></li> <li><a href=http://blog.hatsinthebelfry.com/bengals-8919/>bengals undraftedbengals vs steelers</a></li> <li><a href=http://www.ellephotos.com/blog/cspan-2537/>cspan ap government review</a></li> <li><a href=http://www.tshimogardens.co.za/connecticut-9395/>connecticut renaissance faire</a></li> <li><a href=http://sclway.com/etips>powertrain</a></li> <li><a href=http://www.ellephotos.com/blog/bengals-6247/>bengals hard knocks episode 1</a></li> <li><a href=http://blog.hatsinthebelfry.com/hp-support-2876/>hp support error 1005</a></li> <li><a href=http://www.ellephotos.com/blog/cspan-6205/>c span youtube obama</a></li> <li><a href=http://www.chillclub.net/s/hp-support-9355/>hp support 6310hp support 7200</a></li> <li><a href=http://floralwisdom.com>towns</a></li> <li><a href=http://ichuu.com>tint</a></li> <li><a href=http://blog.hatsinthebelfry.com/cspan-6109/>cspan facebook</a></li> <li><a href=http://www.chillclub.net/s/la-ink-815/>la ink 3rd season</a></li> <li><a href=http://dwkickstart.com/blog>hangers</a></li> <li><a href=http://www.ellephotos.com/blog/chicago-bears-6987/>chicago bears gifts</a></li> <li><a href=http://www.chillclub.net/s/vince-young-832/>vince young 10 11</a></li> <li><a href=http://loadrunner11.com>digitizing</a></li> <li><a href=http://blog.hatsinthebelfry.com/connecticut-5103/>connecticut food bank</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/freida-pinto-9482/></a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/mtv-5756/>mtv executivesmtv fantasy factory</a></li> <li><a href=http://www.chillclub.net/s/hp-support-1095/>hp support contact number</a></li> <li><a href=http://blog.hatsinthebelfry.com/tea-party-4231/>tea party hobbits</a></li> <li><a href=http://www.chillclub.net/s/greg-olsen-3733/>greg olsen puzzles</a></li> <li><a href=http://www.ellephotos.com/blog/bea-9242/>bea 2011 map</a></li> <li><a href=http://www.chillclub.net/s/chad-ochocinco-2667/>chad ochocinco xpchad ochocinco youtube</a></li> <li><a href=http://www.tshimogardens.co.za/bengals-4221/>bengals qb situation</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/randy-moss-16/>randy moss college</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/cspan-8896/>c span shelby foote</a></li> <li><a href=http://www.homesquadcities.net>pudding</a></li> <li><a href=http://www.tshimogardens.co.za/zara-phillips-3911/>zara phillips and the queen</a></li> <li><a href=http://toysforkidsguide.com>rufus</a></li> <li><a href=http://www.ellephotos.com/blog/tea-party-2809/>tea party chicago</a></li> <li><a href=http://www.ellephotos.com/blog/hp-support-6698/>hp support chat</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/zara-phillips-8463/></a></li> <li><a href=http://www.tshimogardens.co.za/bea-1047/>bea goldfishberg</a></li> <li><a href=http://www.ellephotos.com/blog/randy-moss-3374/>randy moss 98 vikings</a></li> <li><a href=http://blog.hatsinthebelfry.com/zara-phillips-4888/>zara phillips school</a></li> <li><a href=http://www.tshimogardens.co.za/dis-1019/>dis pater</a></li> <li><a href=http://blog.hatsinthebelfry.com/tea-party-8562/>tea party 8 28 09</a></li> <li><a href=http://buydarkchocolate.com>michelin</a></li> <li><a href=http://blog.hatsinthebelfry.com/tea-party-6683/>tea party medicare</a></li> <li><a href=http://abettermarriage.info>sticky</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/chicago-bears-6536/>chicago bears tattoos</a></li> <li><a href=http://www.tshimogardens.co.za/chicago-bears-9508/>chicago bears 08 record</a></li> <li><a href=http://www.ellephotos.com/blog/vince-young-7292/>vince young endorsementsvince young foundation</a></li> <li><a href=http://www.chillclub.net/s/cspan-4691/>cspan presidents</a></li> <li><a href=http://www.chillclub.net/s/battleship-6999/>battleship kirishima</a></li> <li><a href=http://www.tshimogardens.co.za/search-1027/>search and seizure</a></li> <li><a href=http://www.ellephotos.com/blog/zara-phillips-6151/>zara phillips and the queen</a></li> <li><a href=http://www.chillclub.net/s/mtv-949/>mtv youtube channel</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/search-847/>search 78search 800 numbers</a></li> <li><a href=http://www.chillclub.net/s/battleship-6275/>battleship yamato wreck</a></li> <li><a href=http://www.ellephotos.com/blog/mtv-2023/>mtv live</a></li> <li><a href=http://www.tshimogardens.co.za/chad-ochocinco-6943/></a></li> <li><a href=http://blog.hatsinthebelfry.com/la-ink-8415/>la ink phone number</a></li> <li><a href=http://www.ellephotos.com/blog/tea-party-496/>tea party zombies download</a></li> <li><a href=http://blog.hatsinthebelfry.com/bea-4896/>beagle</a></li> <li><a href=http://www.chillclub.net/s/battleship-4418/>battleship lexington</a></li> <li><a href=http://www.ellephotos.com/blog/bengals-4766/>bengals merchandise</a></li> <li><a href=http://www.ellephotos.com/blog/battleship-3431/>battleship excel</a></li> <li><a href=http://www.ellephotos.com/blog/dis-1976/>dist 95</a></li> <li><a href=http://whereismike.us/blog>greensboro</a></li> <li><a href=http://blog.hatsinthebelfry.com/search-2615/>search xml file</a></li> <li><a href=http://forsakringar24.se>dailymotion</a></li> <li><a href=http://www.chillclub.net/s/bea-8920/>bea fox</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/bea-9162/>bea rims</a></li> <li><a href=http://www.chillclub.net/s/hp-support-1402/>hp support chat</a></li> <li><a href=http://blog.hatsinthebelfry.com/bengals-5055/>bengals cats for sale</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/hp-support-3496/>hp support id</a></li> <li><a href=http://blog.hatsinthebelfry.com/freida-pinto-8338/></a></li> <li><a href=http://www.tshimogardens.co.za/bengals-6036/>bengals new uniforms 2012</a></li> <li><a href=http://candice.thebestofhypnosis.com>polos</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/cspan-9928/>cspan washington correspondents dinner 2011</a></li> <li><a href=http://detoxing.search-genius.com>bridesmaid</a></li> <li><a href=http://www.ellephotos.com/blog/vince-young-63/>vince young injury</a></li> <li><a href=http://www.ellephotos.com/blog/bengals-3097/>xanadu bengals</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/randy-moss-8261/>randy moss korey stringer</a></li> <li><a href=http://www.ellephotos.com/blog/chad-ochocinco-9160/>chad ochocinco vs skip bayless</a></li> <li><a href=http://blogitstore.com>opera</a></li> <li><a href=http://www.chillclub.net/s/bea-4683/>bea 0b0 105</a></li> <li><a href=http://www.ellephotos.com/blog/vince-young-272/>vince young yahoo stats</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/bengals-907/>bengals insider</a></li> <li><a href=http://backtobodywork.com>squadron</a></li> <li><a href=http://blog.hatsinthebelfry.com/dis-8068/>dis poem</a></li> <li><a href=http://www.tshimogardens.co.za/vince-young-8111/>vince young jay cutler</a></li> <li><a href=http://www.chillclub.net/s/hp-support-8018/>hp support 6500a plus</a></li> <li><a href=http://www.chillclub.net/s/mtv-9684/>mtv 5 cover</a></li> <li><a href=http://www.rhythmkonnections.com.au/drumblog>nozzle</a></li> <li><a href=http://blog.hatsinthebelfry.com/bea-1591/>bea 4603</a></li> <li><a href=http://www.chillclub.net/s/greg-olsen-7018/></a></li> <li><a href=http://blog.hatsinthebelfry.com/bengals-113/>bengals forum</a></li> <li><a href=http://www.tshimogardens.co.za/bengals-9824/>bengals football</a></li> <li><a href=http://blog.hatsinthebelfry.com/hp-support-9750/>hp support 530</a></li> <li><a href=http://blog.hatsinthebelfry.com/battleship-1589/>battleship bismarck wreck</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/zara-phillips-1492/></a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/freida-pinto-1202/>freida pinto jeansfreida pinto kissing</a></li> <li><a href=http://blog.hatsinthebelfry.com/hp-support-6899/>hp support hard drive replacement</a></li> <li><a href=http://www.tshimogardens.co.za/mtv-3304/>mtv oddities</a></li> <li><a href=http://mybest-footforward.com/blog>scored</a></li> <li><a href=http://blog.hatsinthebelfry.com/tea-party-6419/>tea party ribbons</a></li> <li><a href=http://www.france-canicross.com>christina</a></li> <li><a href=http://acccr.net>birthdate</a></li> <li><a href=http://www.tshimogardens.co.za/vince-young-39/>vince young 6</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/la-ink-2957/></a></li> <li><a href=http://www.chillclub.net/s/mtv-4669/>mtv 90s music videos</a></li> <li><a href=http://www.chillclub.net/s/zara-phillips-8586/>zara phillips tongue</a></li> <li><a href=http://www.chillclub.net/s/search-320/>search vim</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/bea-5866/>bea test</a></li> <li><a href=http://www.tshimogardens.co.za/connecticut-8168/>connecticut lottery</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/freida-pinto-5596/>freida pinto 1995</a></li> <li><a href=http://www.tshimogardens.co.za/randy-moss-7059/>randy moss vikings 2011</a></li> <li><a href=http://blog.hatsinthebelfry.com/dis-9761/>dis 2012 conference</a></li> <li><a href=http://www.chillclub.net/s/vince-young-5109/>vince young status</a></li> <li><a href=http://blog.hatsinthebelfry.com/connecticut-2607/>connecticut quarter error</a></li> <li><a href=http://www.tshimogardens.co.za/dis-408/>dis boards cruise</a></li> <li><a href=http://www.ellephotos.com/blog/connecticut-7370/>connecticut state parks</a></li> <li><a href=http://blog.hatsinthebelfry.com/new-england-patriots-955/>new england patriots 07</a></li> <li><a href=http://www.ellephotos.com/blog/search-8397/>search 5500</a></li> <li><a href=http://www.chillclub.net/s/vince-young-6290/>vince young z</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/search-2191/>search tumblr</a></li> <li><a href=http://blog.hatsinthebelfry.com/new-england-patriots-2568/></a></li> <li><a href=http://www.ellephotos.com/blog/vince-young-6016/>vince young rumors</a></li> <li><a href=http://www.ellephotos.com/blog/cspan-6566/>c span yesterdayc span zelaya</a></li> <li><a href=http://www.chillclub.net/s/connecticut-3566/>connecticut 97.7connecticut attorney general</a></li> <li><a href=http://www.tshimogardens.co.za/bea-7532/>bea oracle</a></li> <li><a href=http://www.bookinnfrance.com/blog/fr/randy-moss-3255/>randy moss bio</a></li> <li><a href=http://www.chillclub.net/s/freida-pinto-649/>freida pinto boyfriend</a></li> </div> <!-- linksancx -->

