<?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>Symphonious &#187; Code and Geek Stuff</title> <atom:link href="http://www.symphonious.net/category/code-and-geek-stuff/feed/" rel="self" type="application/rss+xml" /><link>http://www.symphonious.net</link> <description>Living in a state of accord.</description> <lastBuildDate>Fri, 10 May 2013 08:42:25 +0000</lastBuildDate> <language>en-US</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.5.1</generator> <item><title>Ant Dependencies Running Twice</title><link>http://www.symphonious.net/2013/05/10/ant-dependencies-running-twice/</link> <comments>http://www.symphonious.net/2013/05/10/ant-dependencies-running-twice/#comments</comments> <pubDate>Fri, 10 May 2013 08:42:25 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Build Systems]]></category> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1767</guid> <description><![CDATA[Most people believe that ant will only ever execute a target once per execution of ant. So if we have targets A, B, C and D, where A depends on B and C and C and D both depend on D. &#60;target name="A" dependencies="B, C"/&#62;&#60;target name="B" dependencies="D"/&#62;&#60;target name="C" dependencies="D"/&#62;&#60;target name="D"/&#62; &#160; When we run &#8216;ant [...]]]></description> <content:encoded><![CDATA[<p>Most people believe that ant will only ever execute a target once per execution of ant. So if we have targets A, B, C and D, where A depends on B and C and C and D both depend on D.</p><pre>&lt;target name="A" dependencies="B, C"/&gt;<br />&lt;target name="B" dependencies="D"/&gt;<br />&lt;target name="C" dependencies="D"/&gt;<br />&lt;target name="D"/&gt;</pre><p>&nbsp;</p><p>When we run &#8216;ant A&#8217;, we expect each task to execute once, D first, then B  and C, ending with A. Since there is no dependency between B and C, they may execute in any order, so we might also get D, C, B, A. All pretty straight forward.</p><p>Similarly, if we run &#8216;ant B&#8217; we expect (and get) D then B and &#8216;ant C&#8217; gives D then C. Most people expect that if you run &#8216;ant B C&#8217;, the execution path would be D, B, C but that&#8217;s <em>not</em> what happens. Instead we get D, B, D, C. Each target passed to the command line creates a new dependency chain and runs all targets in that chain.</p><p>The other case that catches people out is when using antcall. The antcall task actually sets up essentially a new execution of ant (by default inheriting any properties that have already been set). It never inherits the dependency chain or list of targets that have already been executed. So if our targets were:</p><pre>&lt;target name="A"&gt;<br />  &lt;antcall target="B"/&gt;<br />  &lt;antcall target="C"/&gt;<br />&lt;/target&gt;<br />&lt;target name="B" dependencies="D"/&gt;<br />&lt;target name="C" dependencies="D"/&gt;<br />&lt;target name="D"/&gt;</pre><p>Then the execution order for &#8216;ant A&#8217; would be A,D,B,D,C.</p><p>The cost of running targets twice is reduced because most ant tasks do nothing if their inputs haven&#8217;t changed (so javac only compiles files once), but for a large project there can still be a significant cost in checking over all the files to determine if anything needs to be done. So whenever possible, use actual dependencies to build up a chain of targets instead of antcall or specifying multiple targets on the command line.</p><p>&nbsp;</p><p>&nbsp;</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2013/05/10/ant-dependencies-running-twice/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>Doctypes, Compatibility Modes, Charsets and Fonts</title><link>http://www.symphonious.net/2013/04/26/doctypes-compatibility-modes-charsets-and-fonts/</link> <comments>http://www.symphonious.net/2013/04/26/doctypes-compatibility-modes-charsets-and-fonts/#comments</comments> <pubDate>Fri, 26 Apr 2013 01:08:22 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <category><![CDATA[HTML]]></category> <category><![CDATA[Internationalisation]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1763</guid> <description><![CDATA[This information is all covered in much more detail elsewhere on the web but for my own future reference, here&#8217;s a primer on doctypes, compatibility modes, charsets and fonts which was required to explain why certain Chinese characters weren&#8217;t showing up in IE8. Of course the best answer is that you need to have the [...]]]></description> <content:encoded><![CDATA[<p>This information is all covered in much more detail elsewhere on the web but for my own future reference, here&#8217;s a primer on doctypes, compatibility modes, charsets and fonts which was required to explain why certain Chinese characters weren&#8217;t showing up in IE8. Of course the best answer is that you need to have the East Asian Font pack installed and then it just works (usually) but this tends to be useful background and saves &#8220;server side&#8221; folks from a number of gotchas.</p><h2>Doctypes and Compatibility Modes</h2><ul><li>IE 7 and above has an insane array of compatibility modes which are out to get you. The most common gotcha is that it will use compatibility mode (emulating IE7) if the website is in the &#8220;intranet zone&#8221;. There&#8217;s an option to disable this somewhere in the preferences dialogs.  You wind up in the intranet zone if you&#8217;re accessing a site via any domain name that doesn&#8217;t look like a real one (e.g. http://dog/ is in the intranet zone).</li><li>If you can avoid falling into compatibility mode, any pages including the DOCTYPE as <code>&lt;!DOCTYPE html&gt;</code> or <code>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"&gt;</code> will render in standards compliant mode (where the world is as sane as it gets in web development). Go with the shorter version unless you have a reason not to.</li><li><a
href="http://hsivonen.iki.fi/doctype/#">http://hsivonen.iki.fi/doctype/</a> is the gold standard for information about browser modes.</li></ul><h2>Character Sets and Fonts</h2><ul><li>If you&#8217;re tracking down problems with foreign languages there are two major categories of problems &#8211; encoding corruption (where characters come out garbled or as ?) and missing glyphs in fonts (where characters come out as little boxes).</li><li>Corruption is fixed by specifying the same character encoding everywhere. It is a security issue if any webpage is missing a meta tag defining the character set (smallest variant is <code>&lt;meta charset="UTF-8"&gt;</code>). It must be the first tag in the <code>&lt;head&gt;</code> of the document.</li><li>Little square boxes mean that either the font currently in use doesn&#8217;t have a glyph for that particular character and the font fallback routine was unable to find any font on the system which supports that character. </li><li>Browsers have a default stylesheet which is automatically applied to every page which commonly sets a specific font-family and font-size for text input elements, so adding the style <code>body { font-family: 'Arial Unicode MS' }</code> may get some Asian characters working in the main content but not in text boxes unless you also add <code>input { font-family: inherit; }</code>.</li></ul><p>The security issue mentioned above is that any page which doesn&#8217;t define a character set but includes any form of user supplied content is vulnerable to a cross site scripting injection attack &#8211; even if the user supplied content is escaped properly, because the content may include a character that causes the browser to incorrectly switch to UCS-7 or other weird character sets and drastically change the meaning of the content on the page (hence the user content is no longer correctly escaped). There have been steps taken by modern browsers to remove this risk (including removing support for UCS-7 I believe) but its good practice to specify your charset explicitly anyway.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2013/04/26/doctypes-compatibility-modes-charsets-and-fonts/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Demystifying Doubles: Consistent Inaccuracy</title><link>http://www.symphonious.net/2012/08/29/demystifying-doubles-consistent-inaccuracy/</link> <comments>http://www.symphonious.net/2012/08/29/demystifying-doubles-consistent-inaccuracy/#comments</comments> <pubDate>Wed, 29 Aug 2012 03:36:19 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1733</guid> <description><![CDATA[Of all the data types, double is probably one of the most misunderstood. A huge amount of folk lore has been built up around it to help protect developers from falling into its many pitfalls.  Lately I&#8217;ve done a lot of work replacing usage of BigDecimal with double and learnt a lot about where those [...]]]></description> <content:encoded><![CDATA[<p>Of all the data types, double is probably one of the most misunderstood. A huge amount of folk lore has been built up around it to help protect developers from falling into its many pitfalls.  Lately I&#8217;ve done a lot of work replacing usage of BigDecimal with double and learnt a lot about where those pitfalls are and how the folk lore can be misleading.</p><p>The great challenge with double is that it has a degree of inaccuracy because of the way the number is actually stored.  For example, the number 2983792734924.2293 actually winds up being stored as 2983792734924.2295, a tiny difference but with far reaching consequences. All of the folk lore around doubles is designed to deal with this potential for inaccuracy.</p><p>One piece of folk lore is that you should never do a strict comparison of double values (e.g. with == or !=).  Due to the inaccuracy of doubles you should always compare them with a level of tolerance:</p><pre>abs(doubleA - doubleB) &lt; tolerance</pre><p>It&#8217;s important to realise however, that this inaccuracy isn&#8217;t random, it&#8217;s perfectly consistent and predictable.  The number 2983792734924.2293 <em>always</em> comes out as 2983792734924.2295.  The same applies if you parse it from a string: parseDouble(&#8220;2983792734924.2293&#8243;) <em>always</em> comes out as 2983792734924.2295.  As a result the following are consistently true:</p><pre>2983792734924.2293 == 2983792734924.2293
parseDouble("2983792734924.2293") == 2983792734924.2293
parseDouble("2983792734924.2293") == parseDouble("2983792734924.2293")</pre><p>Introducing tolerance to the comparison can lead to subtle bugs. For example, if we were updating our model with user input we might have something like:</p><pre>// In our model:
public void setAmount(double amount) {
  this.amount = amount;
  fireChangeEvent();
}
// In our UI code:
model.setAmount(parseDouble(widget.getText()));</pre><p>So far so good, but what if we want to avoid firing the change event if the value hadn&#8217;t really changed?  We might change the model code to:</p><pre>public void setAmount(double amount) {
  if (abs(amount - this.amount) &gt; 0.01) {
    this.amount = amount;
    fireChangeEvent();
  }
}</pre><p> It follows the double folk lore, but also introduces a bug. Let&#8217;s say the user first enters the amount &#8217;1&#8242;.  Then they change the amount to &#8217;1.001&#8242;.  The second amount is within the tolerance so it&#8217;s not considered an actual change. The user is now looking at a text field that says 1.0001, but the model thinks the value is still 1.   You can make the tolerance smaller but that just means the user has to enter more zeros to trigger the problem.</p><p>The right answer is to take advantage of the fact that inaccuracy with doubles is consistent and do the comparison using strict comparison:</p><pre>public void setAmount(double amount) {
  if (about != this.amount) {
    this.amount = amount;
    fireChangeEvent();
  }
}</pre><p>So when doesn&#8217;t this work? When the two values are calculated in different ways. So:</p><pre><strong>(1491896367462.1147 * 29.837927349242293)</strong> / 2.3982983923
= 18561116318075.207
1491896367462.1147 * <strong>(29.837927349242293 / 2.3982983923)</strong>
= 18561116318075.203</pre><p>The only difference between the two equations is the order of evaluation &#8211; they <em>should</em> give the same answer, but because doubles have a degree of inaccuracy the intermediate result is rounded to something that will fit in a double, so the order of evaluation matters because it affects what rounding is done to the intermediate result. Repeating the exact same calculation will always give the exact same result, but if there&#8217;s any chance that the values were calculated in different ways, comparisons must be done with tolerance.</p><p>So the folk lore about needing to compare doubles with some tolerance is perfectly valid, good advice, but be aware that it introduces its own inaccuracy which may cause problems. You should consider what the impact of falsely deciding that the values are different vs falsely deciding that the values are the same; which side should you err on?</p><p>Sometimes you really do want a strict comparison, even between doubles.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/08/29/demystifying-doubles-consistent-inaccuracy/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Continuous Integration Requires Integrating Continuously</title><link>http://www.symphonious.net/2012/07/31/continuous-integration-requires-integrating-continuously/</link> <comments>http://www.symphonious.net/2012/07/31/continuous-integration-requires-integrating-continuously/#comments</comments> <pubDate>Tue, 31 Jul 2012 03:31:19 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Build Systems]]></category> <category><![CDATA[Code and Geek Stuff]]></category> <category><![CDATA[XP]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1724</guid> <description><![CDATA[Sarah Goff-Dupont has a post on the Atlassian blog about how Atlassian is using feature branches and still doing continuous integration: In the not-so-recent past, continuous integration in the context of story branching was considered so impractical as to be outright incompatible.  Who has time to manually configure a CI scheme for dozens of active branches [...]]]></description> <content:encoded><![CDATA[<p><a
href="http://blogs.atlassian.com/2012/07/feature-branching-continuous-integrationgit-bamboo/">Sarah Goff-Dupont has a post on the Atlassian blog</a> about how Atlassian is using feature branches and still doing continuous integration:</p><blockquote><p>In the not-so-recent past, continuous integration in the context of story branching was considered so impractical as to be outright incompatible.  Who has time to manually configure a CI scheme for dozens of active branches that will only live a couple of days?  Nobody –that’s who.  And story branch-loving teams would frequently encounter *ahem* “surprises” when merging work onto the main code line –”master”, in Git-speak.  But recent versions of Bamboo have essentially removed that overhead and allowed these two frenenmies to become genuinely harmonious partners in our development lifecycle.</p></blockquote><p>Unfortunately, what Sarah describes is not continuous integration. At best, it&#8217;s regular integration but really it&#8217;s just automated testing. The key principal of continuous integration is that all developers are merging all changes, all the time. That way you see the messy combinatorial effects of concurrent changes and can fix them before you waste a lot of time going down incompatible paths. Anything that reduces the frequency of doing that integration is a step away from continuous integration, regardless of how often automated tests are run.</p><p>Let&#8217;s take a look at the basic process they&#8217;re using:</p><blockquote><p>Next, we go into development and testing cycles on the story branch.  The developer is making local commits on her workstation.  [...]  When she reaches a point where she wants to run tests against her work, the developer pushes those local commits up to the repository –still on the story branch, of course.  Bamboo sees that there’s been a change, and starts building the corresponding Plan branch/es.</p></blockquote><p>This is not continuous integration. The developer&#8217;s changes are being kept away from the main team and not integrated while they&#8217;re being developed, while they sitting just in the local git repository and while they&#8217;re in the story branch. Even though Bamboo runs tests against the code, there has been no integration done here. This is just automated testing, not continuous integration.</p><p>It seems that Atlassian have discovered this lack of integration and have developed ways of combating it:</p><blockquote><p>To help find conflict before merging to master, the developer can choose to have Bamboo merge master into her story branch each time she pushes changes to the repo, then run through the CI Plan against the merged code. If the Plan passes, Bamboo will commit the merged code to her branch.</p></blockquote><p>Finally we get some integration happening, but only one way. Since everyone&#8217;s off working on feature branches this is really only integrating with completed stories. All the work going on in parallel on other stories is still not integrated so we have no idea if they will work when combined.</p><blockquote><p>Some teams are taking this workflow a step further and requiring developers to merge to an integration branch during development, before finally merging the completed story to master. This practice ferrets out integration issues even faster. Developers get to mash their in-progress stories together several times a day, rather than waiting until one has merged a completed story to master (which may happen only every 2-3 days) and the other has pulled code from master onto their story branch.</p></blockquote><p>The key lesson here is that if we integrate more often, it&#8217;s easier to ferret out integration issues. It&#8217;s like continuous integration but with the extra fun of managing branches&#8230;</p><p>Of course, Atlassian aren&#8217;t alone in the use of feature branches &#8211; it&#8217;s become all the rage since DVCS supposedly made branching cheap and merging painless. Unfortunately while DVCS has eliminated many of the basic mechanics of merging, they haven&#8217;t done anything to reduce the risk of different developers push the codebase in incompatible directions at a structural level. The only way to avoid that is to integrate all changes as often as possible &#8211; that&#8217;s continuous integration.</p><p>The only way that feature branching and continuous integration can be at all compatible is if the build system automatically builds and tests every possible combination of branches, all the time &#8211; a massive waste of build system resources. Anything less leaves potential combinations untested until they are finally merged on to master and all the problems are discovered.</p><p>Or you know, we could just do continuous integration&#8230;</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/07/31/continuous-integration-requires-integrating-continuously/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>Golden Rule of Dependency Management</title><link>http://www.symphonious.net/2012/06/19/golden-rule-of-dependency-management/</link> <comments>http://www.symphonious.net/2012/06/19/golden-rule-of-dependency-management/#comments</comments> <pubDate>Tue, 19 Jun 2012 01:54:48 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Build Systems]]></category> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1707</guid> <description><![CDATA[There&#8217;s a huge amount of complaining and problem solving for various dependency management solutions (particularly maven, but ivy and friends certainly aren&#8217;t immune). Problems range from having optional dependencies unnecessarily included  to having duplicate classes or class conflicts and the solutions tend to be complex and involve a lot of trade offs. All these problems [...]]]></description> <content:encoded><![CDATA[<p>There&#8217;s a huge amount of complaining and problem solving for various dependency management solutions (particularly maven, but ivy and friends certainly aren&#8217;t immune). Problems range from having optional dependencies unnecessarily included  to having duplicate classes or class conflicts and the solutions tend to be complex and involve a lot of trade offs. All these problems stem from breaking the golden rule of dependency management:</p><blockquote><p><strong>Own your own repository</strong></p><p
style="padding-left: 30px;">&#8211; Sutton&#8217;s golden rule of dependency management</p></blockquote><p>The vast majority, if not all, problems with dependency management comes from having incorrect, conflicting or imprecise meta-data in the repository of dependencies. Maintaining a public repository of perfectly accurate, precise and flexible dependency metadata is next to impossible &#8211; there are just too many libraries and the interrelationships are too complex. Fortunately, even extremely large companies only use a tiny subset of these libraries. With the scope reduced it&#8217;s much easier to ensure the metadata is correct and consistent.</p><p>Any time you need to introduce a new dependency, very carefully review the metadata associated it and correct any errors or inconsistencies before importing it into the repository you administer and control.</p><p>You don&#8217;t let anyone commit to your source code repository, don&#8217;t let anyone commit to your dependency repository either.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/06/19/golden-rule-of-dependency-management/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Minimise Configuration</title><link>http://www.symphonious.net/2012/06/05/minimise-configuration/</link> <comments>http://www.symphonious.net/2012/06/05/minimise-configuration/#comments</comments> <pubDate>Tue, 05 Jun 2012 05:27:47 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1701</guid> <description><![CDATA[Having configuration differences between development and production is largely unavoidable, but it&#8217;s important to keep the number of differences to a minimum to avoid unexpected bugs appearing in production that don&#8217;t occur in development mode. More than that though, it&#8217;s important to minimise configuration. Configuration is Code Often things are put in configuration files so [...]]]></description> <content:encoded><![CDATA[<p>Having configuration differences between development and production is largely unavoidable, but it&#8217;s important to keep the number of differences to a minimum to avoid unexpected bugs appearing in production that don&#8217;t occur in development mode. More than that though, it&#8217;s important to minimise configuration.</p><h2>Configuration is Code</h2><p>Often things are put in configuration files so that they are easy to change later, often without a full redeployment of the software, but that also implies it can be changed without going through the full testing that a release would usually be subject to. It&#8217;s rare for automated tests to cover more than one possible setting for these configuration options so changing them in production is equivalent to deploying completely untested code. What&#8217;s worse, it&#8217;s quick and easy to do with no audit trail of what happened and when.</p><p>These settings should be avoided altogether and the values hard coded in the built product and deployed along with it.  That may be as simple as embedding the existing config file in the built software &#8211; the aim isn&#8217;t necessarily to mix configuration and code, only to remove the options to change the configuration outside of the normal development and deployment process.</p><p>For settings that are designed to be changed by the user as a normal part of using the software, make sure that the full range of values is tested, just like any other system input should be.</p><h2>Soft Coding</h2><p>The most extreme form of configuration is &#8220;soft coding&#8221; where the system becomes so configurable its essentially a poor-man&#8217;s programming language. <a
href="http://thedailywtf.com/Articles/Soft_Coding.aspx">The Daily WTF has an excellent explanation of soft coding and how even the best of intentions can lead to it.</a></p><h2>Dealing with Production Problems</h2><p>One of the biggest reason people make options configurable by administrators is so that they can quickly reconfigure things to resolve issues in production. Sadly, the worst time you could be making untested changes in production is when things are already behaving in unexpected ways. Instead, make the build, test and deployment process for your software so fast and so seamless that you can make the change in code, fully test it and get it out to production fast enough to resolve the issue. Doing so isn&#8217;t easy, but it delivers immense value beyond just resolving production issues.  It allows you to more reliably and more rapidly deploy any code change into production. That means spending less time wrangling releases and more time improving the product.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/06/05/minimise-configuration/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Default to Development Settings</title><link>http://www.symphonious.net/2012/05/28/default-to-development-settings/</link> <comments>http://www.symphonious.net/2012/05/28/default-to-development-settings/#comments</comments> <pubDate>Mon, 28 May 2012 05:55:00 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <category><![CDATA[System Administration]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1698</guid> <description><![CDATA[Most systems have multiple configuration profiles &#8211; one for production, one for development and often other profiles for staging, testing etc.  Minimising differences between these configurations is critical but there are inevitably some things that just have to be different. This then leaves the question, what should the default settings be? There are three main [...]]]></description> <content:encoded><![CDATA[<p>Most systems have multiple configuration profiles &#8211; one for production, one for development and often other profiles for staging, testing etc.  Minimising differences between these configurations is critical but there are inevitably some things that just have to be different. This then leaves the question, what should the default settings be?</p><p>There are three main options:</p><ul><li>Default to production values</li><li>Default to development values</li><li>Refuse to start unless an environment has been explicitly chosen</li></ul><p>My preference is to default to development values. Why?</p><p>Development values should be &#8220;safe&#8221; in terms of any external integrations. So a developer isn&#8217;t going to accidentally start sending real buy or sell instructions to your stock broker.</p><p>There are more developers than production systems. If you default to production systems, every developer needs to remember to switch to development mode whenever they setup a new checkout. Defaulting to development mode means it just works for the most common case.</p><p>Checking authentication credentials for external systems into your source control system is generally considered a bad security practice, so the default values are unlikely to actually work in production anyway.</p><p>The down side with defaulting to development is it&#8217;s possible to accidentally deploy to production with development values causing an outage. This can be pretty easily prevented with automated deployments or using tools like RPM where files can be marked as config and thus avoid overwriting them when doing updates.</p><p>Refusing to start is the worst of all worlds &#8211; every developer has to specify a configuration mode <em>and</em> you still risk production outages by not specifying a mode.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/05/28/default-to-development-settings/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Juries and Complex Subjects</title><link>http://www.symphonious.net/2012/05/23/juries-and-complex-subjects/</link> <comments>http://www.symphonious.net/2012/05/23/juries-and-complex-subjects/#comments</comments> <pubDate>Tue, 22 May 2012 23:35:09 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1696</guid> <description><![CDATA[There is a lot of discussion at the moment about the Oracle v Google trial today, mostly centring around how impossible it is for the jury to understand the very technical concepts involved in the case.  As Daring Fireball puts it: How could a randomly-selected jury possibly decide this? No knock intended against the jurors themselves — [...]]]></description> <content:encoded><![CDATA[<p>There is a lot of discussion at the moment about the Oracle v Google trial today, mostly centring around how impossible it is for the jury to understand the very technical concepts involved in the case.  <a
href="http://daringfireball.net/linked/2012/05/22/jury-oracle-google">As Daring Fireball puts it</a>:</p><blockquote><p>How could a randomly-selected jury possibly decide this? No knock intended against the jurors themselves — and it sounds like they’re doing their best to make an informed decision. But there’s a difference between a jury of your citizen peers and a jury of your technical peers.</p></blockquote><p>Indeed, the situation is fairly ridiculous, however it&#8217;s not at all unique to technology. Juries are expected to evaluate extremely complex laws in most cases and contracts between parties can be just as confusing as any technical issue. Even when the law is relatively clear the elements of a case can be extremely complex &#8211; trying to understand exactly what forensic evidence does and doesn&#8217;t show for example.</p><p>The challenges for the jury in this trial are obvious to people with technical background, but the challenges for the jury in other types of cases is likely to be just as obvious to experts in those fields. Of course if we tried to create a jury of peers from the area of expertise required, we&#8217;d just create the extremely difficult challenge of deciding who is qualified and who isn&#8217;t.</p><p>It&#8217;s not a perfect system, but it is the best one we have.</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/05/23/juries-and-complex-subjects/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>Joho the Blog » Will tablets always make us non-social consumers?</title><link>http://www.symphonious.net/2012/05/21/joho-the-blog-will-tablets-always-make-us-non-social-consumers/</link> <comments>http://www.symphonious.net/2012/05/21/joho-the-blog-will-tablets-always-make-us-non-social-consumers/#comments</comments> <pubDate>Mon, 21 May 2012 22:55:31 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Code and Geek Stuff]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1693</guid> <description><![CDATA[I thus think (= hope) that it’s a mistake to extrapolate from today’s crappy input systems on tablets to a future of tablet-based couch potatoes still watching Hollywood crap. We’re one innovation away from lowering the creativity hurdle on tablets. Maybe it’ll be a truly responsive keyboard. Or something that translates sub-vocalizations into text (because [...]]]></description> <content:encoded><![CDATA[<blockquote>I thus think (= hope) that it’s a mistake to extrapolate from today’s crappy input systems on tablets to a future of tablet-based couch potatoes still watching Hollywood crap. We’re one innovation away from lowering the creativity hurdle on tablets. Maybe it’ll be a truly responsive keyboard. Or something that translates sub-vocalizations into text (because I’m too embarrassed to dictate into my table while in public places). Or, well, something.
via <a
href="http://www.hyperorg.com/blogger/2012/05/21/will-tablets-always-make-us-non-social-consumers/">Joho the Blog » Will tablets always make us non-social consumers?</a>.</blockquote> I suspect that the idea that input systems on tablets are crappy will rapidly become a tell-tale sign of age. Feature phones have &#8220;crappy&#8221; input systems and yet with learning, and some rather unfortunate adaptations of language, people quite happily chat away via SMS. The same process will happen with tablets &#8211; people will simply learn to type on on-screen keyboards fast enough that they don&#8217;t consider them crappy. It&#8217;s also important to remember that the vast majority of people can&#8217;t type particularly fast on a full size desktop keyboard so the bar for satisfaction is significantly lower than geeks would expect.]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/05/21/joho-the-blog-will-tablets-always-make-us-non-social-consumers/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>So Long EditLive! and Thanks For All The Fish (with rounded corners and drop shadows)</title><link>http://www.symphonious.net/2012/05/17/so-long-editlive-and-thanks-for-all-the-fish-with-rounded-corners-and-drop-shadows/</link> <comments>http://www.symphonious.net/2012/05/17/so-long-editlive-and-thanks-for-all-the-fish-with-rounded-corners-and-drop-shadows/#comments</comments> <pubDate>Thu, 17 May 2012 10:20:24 +0000</pubDate> <dc:creator>Adrian Sutton</dc:creator> <category><![CDATA[Editors]]></category> <guid
isPermaLink="false">http://www.symphonious.net/?p=1691</guid> <description><![CDATA[Since the very early days of my blogging, I&#8217;ve integrated a copy of EditLive! to make the editing pleasant and more powerful. For many, many years there was simply no way I could bring myself to use anything else. Lately though, Apple have been making Java applets less and less appealing while browsers have been [...]]]></description> <content:encoded><![CDATA[<p>Since the very early days of my blogging, I&#8217;ve integrated a copy of EditLive! to make the editing pleasant and more powerful. For many, many years there was simply no way I could bring myself to use anything else. Lately though, Apple have been making Java applets less and less appealing while browsers have been continuously improving their content editable suport and JavaScript editors have gotten better at working around the remaining quirks and smoothing off the rough edges on the editing experience.  The final straw for me though was that the current early access release of EditLive! 8.0, which appears to include a lot of fixes for the latest OS X, breaks backwards compatibility with a number of APIs I use to integrate it into this blog.</p><p>So the time has finally come to switch to TinyMCE. I still have a custom plugin to fix some of the incredibly poor configuration choices made by default in WordPress (<a
title="P tags are important remember" href="http://www.symphonious.net/2010/09/07/why-p-tags-are-your-friends/">P tags are important remember!</a>) but it&#8217;s significantly less custom code and complexity. There are also a bunch of new features that have built into WordPress which I&#8217;d never enabled in my EditLive! integration which are nice to have.  The biggest win however is that I can now write blog posts on my iPad, so hopefully I can share a few more links and quick thoughts without having to drag out my laptop.</p><p>It is sad to retire EditLive! though. I worked to build it almost from scratch for nearly 10 years and for most if not all of that time it was the absolute cream of the crop for in browser editing with features and usability that were simply unmatched. I have some slight consolation that I&#8217;ve also been able to spend some time contributing to TinyMCE and I know the guys behind it are top notch so I&#8217;m happy to pass the baton of favourite editor over. I will miss the integrated image editor and its rounded corners and drop shadows&#8230;</p>]]></content:encoded> <wfw:commentRss>http://www.symphonious.net/2012/05/17/so-long-editlive-and-thanks-for-all-the-fish-with-rounded-corners-and-drop-shadows/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>