<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8115611867353523040</id><updated>2011-08-27T10:35:34.568+01:00</updated><category term='apache'/><category term='Web Queries'/><category term='Shell'/><category term='xlsx'/><category term='Netbeans'/><category term='MySQL'/><category term='Ruby'/><category term='Debugger'/><category term='Javascript'/><category term='Linux'/><category term='Polling'/><category term='Cron'/><category term='HTML'/><category term='Server'/><category term='monitoring'/><category term='Forms'/><category term='Monit'/><category term='Web'/><category term='Excel'/><title type='text'>MainyMike's Blog</title><subtitle type='html'>My stray thoughts on the world of IT.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-7054514572411574883</id><published>2011-08-27T10:35:00.001+01:00</published><updated>2011-08-27T10:35:34.585+01:00</updated><title type='text'>Firefox "Caret Browsing"</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;A very short post ...&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;For a while my Firefox has been showing a blinking caret on all pages, even on pop-ups. Turns out I must have inadvertently hit 'f7' at some point which turns on a traditional text editor style caret for text selection (i.e one you can see).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;There's nothing obvious in the options to disable this. But pressing 'f7' again sorts it out. &amp;nbsp; I wouldn't have thought to search for 'caret' in the options(!)&lt;/span&gt; &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-7054514572411574883?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/7054514572411574883/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=7054514572411574883' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/7054514572411574883'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/7054514572411574883'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/08/firefox-caret-browsing.html' title='Firefox &quot;Caret Browsing&quot;'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-4857980019328473091</id><published>2011-07-21T12:02:00.001+01:00</published><updated>2011-08-18T12:43:39.092+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Cron'/><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Crontab Shells</title><content type='html'>&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Sometimes you'll be able to execute a Linux shell command fine from the command prompt, but fail when you use the same command from Cron. You might even have remembered to address the script/whatever correctly, and run Cron from the appropriate user, yet it might complain about the syntax of the actual command.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;I've found that this is generally down to different shell interpreters being used. Although the documentation strongly implies that when a SHELL directive is not specified in a user-level Crontab, it will use the one specified in /etc/passwd, this doesn't seem to be the case.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;I have a user with /bin/bash set-up, but it's clear in the output mailed by Cron that the SHELL is /bin/sh.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;So you might have to explicitly set a SHELL= environment in your crontab.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;(I don't think it helps when Ubuntu distro's jump between bash and dash, but that's probably another tale...)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Addendum &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Another important note for CRONTAB entries. The CRON program treats '%' as a line terminator. If your commands are failing, and the email you get seems to show only part of the command line, you probably have a '%' in the command. You need to either escape the % with a preceding '\' (e.g. "date +\%e") or pipe the command through sed.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-4857980019328473091?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/4857980019328473091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=4857980019328473091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/4857980019328473091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/4857980019328473091'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/07/crontab-shells.html' title='Crontab Shells'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-3357802325285915065</id><published>2011-06-28T21:51:00.001+01:00</published><updated>2011-06-28T22:06:20.199+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Monit'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><title type='text'>Monit for Monitoring - check your default page!</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I have a few servers that I look after at work, and having spent too long staring at them day after day, night after night, just to make sure they are working, I decided I needed some better alerting and monitoring.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Being a Ruby fan I looked closely at both 'god' and 'blue-pill', but at the end of the day decided against both. Partly due to concerns raised about memory-usage with a Ruby-based package (although most of these fears seem to have been allayed in recent versions), but also because you really don't want a big footprint on a monitoring product. You should not need to monitor a monitor.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So at the end of a little research I installed 'Monit' on the servers. This has a nice little web interface (secured) that will enable you both to monitor, and restart monitored services. Ideal if you can't SSH onto a server and just need to get things back up and running. The monitoring file syntax is simple and there are examples for the common sorts of services you might want to monitor (MySQL, Postfix, Apache, ...) You can be simply alerted on certain conditions (storage, CPU, #children) or have corrective action taken (restarting a service; stopping it; so on).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I've found at lest one thing to be wary of though. You can monitor a "web process" (e.g. Apache) by checking once per 'monitoring cycle' that your specific port responds to a specific protocol. This can go as far as checking the response from the protocol - e.g. test that page 'home.html' returns some regular expression. Quite nice, but rarely needed - Apache is rock solid in my experience. Simply knowing the process is active is good enough. However, if you *do* choose to run a default&amp;nbsp; 'protocol HTTP' test, then this will 'GET /' from your site. I was looking at my MySQL logs and noticed a connection and a couple of SELECTs every 5 minutes. Baffling, until I noticed they coincided with the Monit probes as seen in the Apache logs. The website in question sits at the base of the domain, and when sending the home page also checks to see if a cookie is present in the database, and if not builds a default response, from default settings held in the database - hence the calls to the database. I'm not happy about polling my database server every 5 minutes (see one of my previous posts!) so I've now reverted to a simple port 80 TCP probe - that just checks the port is open rather than sends in an HTTP request. I feel this is good enough ... as I said, if Apache is there at all, then it's working.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So you might have a large home page with lots of dynamic content. Be aware that that page will be fetched by Monit whenever it checks your web server. Probably not an issue for most, but weigh the cost against the value.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-3357802325285915065?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/3357802325285915065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=3357802325285915065' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/3357802325285915065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/3357802325285915065'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/06/monit-for-monitoring-check-your-default.html' title='Monit for Monitoring - check your default page!'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-785602950747308514</id><published>2011-06-28T20:32:00.002+01:00</published><updated>2011-06-28T22:07:17.459+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web'/><category scheme='http://www.blogger.com/atom/ns#' term='Javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='Forms'/><category scheme='http://www.blogger.com/atom/ns#' term='HTML'/><title type='text'>When submit !=== submit</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;One of those little 'gotchas' in HTML/Javascript ... if you're happily attempting to submit a form using the 'document.form.submit()' tied to an event (such as an 'onChange' on a select box) then you must make sure that 'submit' is actually the function/method 'submit' and not an element on your page.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;By that, I mean, you might have a "normal" submit button that you've called 'submit'. And that will "not be a function" so it won't go submitting the form if you invoke it.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Nice post on it: http://thedesignspace.net/MT2archives/000292.html&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;In the past I've always "blanket-covered" my submit button by using id='submit', name='submit', and type='submit'. Not so in future.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-785602950747308514?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/785602950747308514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=785602950747308514' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/785602950747308514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/785602950747308514'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/06/when-submit-submit.html' title='When submit !=== submit'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-6272694593883752213</id><published>2011-05-23T12:21:00.007+01:00</published><updated>2011-06-28T22:08:06.059+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='Server'/><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='monitoring'/><category scheme='http://www.blogger.com/atom/ns#' term='Polling'/><title type='text'>How I handle "MySQL Server has gone away"</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;The Problem&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I use Ruby and the Sinatra framework for developing web-based applications. I prefer Sinatra's lightweight approach over Rails. For similar reasons, I "roll-my-own" database classes rather than utilise something like ActiveRecord or DataMapper (the latter looks more tempting of the two for Ruby developers).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;During development I've occasionally encountered the "MySQL Server has gone away" situation, which is a frequently raised issue, and various solutions exist. These range from periodic "false transactions" to keep the MySQL connection active; adding a 'before' filter to your Sinatra application to verify the connection status; and using ActiveRecord (which would appear to perform its own 'verify' prior to each call).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I'm against these solutions.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I don't like wasting resources, and these sound a lot like that. Okay, while my server is idling and under no stress then I have resources to burn, and that's typically the case. Certainly stray database access costs next to nothing when your database and application are on the same server, but imagine when your app takes off (dream of Twitter here!) and you have a distributed load-balanced farm of servers to work with. Okay - you won't be using the current solution, but to me these solutions just smack of quick-fixes without a lot of thought.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To put it another way - consider the 'verify before use' scenario. At 11 in the morning, when your application has been up for 3 hours, and served 10,000 MySQL requests, you will have asked (10,000 times) "are you there?", to which MySQL will have responded "yup". After about 9,999 queries, MySQL ought to respond with "yes ... didn't you listen the last 9,999 times!" and take its ball away. When we're working, we're working, and there's no need to check. It's only in those edge cases where we haven't been doing anything for a while we need to ask before using.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Another solution is to increase the 'wait_timeout' parameter of MySQL. By default it's 8 hours, but is increasing it a solution? What do you increase it to? 12 hours will probably get you from day-to-day, but not across a weekend. 48 hours? Okay - what about&amp;nbsp; a long weekend? And do you want the connection to remain open when nobody is going to use it for several days? No. If you aren't going to be used, don't be there.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;-----&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Okay. Back to how the issue arises. You connect to MySQL, and generally re-use that connection on subsequent calls, rather than open new connections for each request (because spread across a large user base, making many calls you soon run out of connections ... your solution doesn't scale that way). Effectively you're using some form of 'pooled thread manager' to handle connections between your application and the database. When both are being utilised, all is well; what happens when your application is quiet though, is that (after 8 hours / 'wait_timeout' seconds) MySQL (silently) closes the open connections. And then a disconnect exists between what your application believes is the state of the connection, and the actual state. So your application attempts a request on an inactive connection, and "MySQL Server has gone away".&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;Another solution is the inelegant 'try/catch' around any SQL call. Catch the error, verify it's a connection issue, and re-connect. This is not resource wasteful (on the MySQL side) but leads to sloppy coding practice. I've seen entire applications where every method is enclosed within a try/catch pair. If that were really a 'solution' (to everything) the language would already support it out-the-box, rather than demand a ubiquitous trap around every event. Prolific use of such techniques points to an architectural issue, beyond solely your database access mechanism. But enough of that ...&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;What we really want is to ensure our database connection state is accurately reflected within the application (when it needs to know it). It would be useful if MySQL triggered an event when it closed a connection (through timeout) rather than doing it silently (the .net modules do have such an event, but it is not for this situation - it is a reflection of a deliberate application event, not of one originating within MySQL) but it doesn't appear to - or if it does, I could find no documentation of it, nor anything in any logs - so we'll have to monitor the situation ourselves and react accordingly. However, once we've achieved this we can ensure that the application re-connects &lt;b&gt;only when&lt;/b&gt; it needs to, yet also enable the connection to timeout naturally, based on its configuration. Moreover we would not need to unnecessarily verify the connection status prior to each call.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;-----&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: large;"&gt;My Solution&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;To implement a simple 'synchronisation' mechanism between application and database connection, I have written a simple server-side job which queries the database connection:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;A cron job which runs each day at 23:30 (on a work day the connections will typically be open at this time).&lt;/span&gt;&lt;/div&gt;&lt;ul style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt; It interrogates MySQL (SHOW PROCESSLIST / SHOW GLOBAL VARIABLES) to see how 'old' the database connections are, and when they are due to expire&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Sleeps until this time (or 10 seconds after that time actually)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;Re-awakens to check the connections again&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;If nothing has happened in the interim, the connections will now be inactive - in which case the application is signalled to update it's connection view to 'closed' (and hence the thread management will re-connect when next used)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;If they are active (implying some database calls have been made) the new 'timeout' time is recalculated, and the process sleeps again, until that time.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This carries on until the new 'timeout' time is beyond the next day's process start time (in my case, 23:30 the next day) when the process quits.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;On a typical week (work) day the process runs at 23:30; immediately sleeps until 03:00; wakes and tells the application that the connections are closed, and then exits. The application re-connects (around 07:00) and the day progresses as 'normal'. I have only a sleeping process which exists in the server for a few hours overnight.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;At the weekends, the process runs at 23:30 then does nothing as the connections have been 'closed' the previous day.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;When work continues overnight, the process can run around 03:00, then at 10:00, and 18:00. Each time it awakes briefly, tests the connection, and sleeps again.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;-----&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;This solution keeps the application clean - it is concerned with using connections that it knows the state of, and does not add unnecessary verifications to connections that are being used and are active. The database connections can quiescence based on their timeout values and are not unnecessarily open for longer than they need be. The server has an extra process runnning, but not all of the time, and it sleeps for the majority of the time.&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I need to improve the process to create 'monitor threads' on a per database level (I have isolated databases on a per system basis - at present they are all accessed synchronously, so they all timeout in harmony, but this isn't necessarily the case).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;"My SQL Server has gone away" still happens - I just know when it does now.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-6272694593883752213?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/6272694593883752213/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=6272694593883752213' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/6272694593883752213'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/6272694593883752213'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/05/ensuring-mysql-server-hasnt-gone-away.html' title='How I handle &quot;MySQL Server has gone away&quot;'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-458621079531483578</id><published>2011-04-19T15:57:00.002+01:00</published><updated>2011-06-28T22:12:19.508+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><category scheme='http://www.blogger.com/atom/ns#' term='Debugger'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Adding Ruby fast-debugger to Windows</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;I've recently started to use Netbeans at work for my Ruby development (I fancy having a go with RubyMine, but Netbeans will do for now. RubyMine looks v similar but is more Rubyesque (of course) and permits easier remote debugging).&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;One issue with the Windows installation is that the ruby-debug-ide gem will not install; it's unable to build from native extensions. The fix I found is in the following comment (not in the main article):&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;http://www.definenull.com/content/netbeans-6-ruby-fast-debugger#comment-251 &lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;If that comment goes, here are the instructions:&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;h3&gt;&lt;a class="active" href="http://www.definenull.com/content/netbeans-6-ruby-fast-debugger#comment-251"&gt;RubyInstaller DevKit fixes this&lt;/a&gt;&lt;/h3&gt;&lt;/blockquote&gt;&lt;div class="content" style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;blockquote&gt;If you install Ruby using RubyInstaller (&lt;a href="http://rubyinstaller.org/download.html" title="http://rubyinstaller.org/download.html"&gt;http://rubyinstaller.org/download.html&lt;/a&gt;), and next install RubyInstaller Development Kit (&lt;a href="http://wiki.github.com/oneclick/rubyinstaller/development-kit" title="http://wiki.github.com/oneclick/rubyinstaller/development-kit"&gt;http://wiki.github.com/oneclick/rubyinstaller/development-kit&lt;/a&gt;) on top of that, then the NetBeans "Install Fast Debugger" feature works without problems.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The RubyInstaller Development Kit provides some standalone elements of MinGW for compiling Ruby native C extensions.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Joe Howse&lt;/blockquote&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;span style="font-size: small;"&gt;So basically, install the DevKit and then the gem installation from inside Netbeans works fine. Thanks to "Joe Howse"!&lt;/span&gt;&lt;/div&gt;&lt;span style="font-size: small;"&gt;&lt;span style="font-family: Verdana,sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-458621079531483578?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/458621079531483578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=458621079531483578' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/458621079531483578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/458621079531483578'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/04/adding-ruby-fast-debugger-to-windows.html' title='Adding Ruby fast-debugger to Windows'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-7214904469084090264</id><published>2011-02-20T17:22:00.001Z</published><updated>2011-06-28T22:11:31.077+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xlsx'/><category scheme='http://www.blogger.com/atom/ns#' term='Excel'/><category scheme='http://www.blogger.com/atom/ns#' term='Web Queries'/><title type='text'>Editing XLS files with embedded Web Queries...</title><content type='html'>&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;...is very tough!&amp;nbsp; It's as though as soon as you go near them everything goes wrong. It's not helped by the fact that you can define the query in an external IQY file, but if that file doesn't exist (the spreadsheet was built by user A, but is passed to user B), Excel falls back to using the definition embedded within the spreadsheet itself. So there doesn't have to be a connection between the values shown on the screen and what is in the file (and that sneaky option which says "keep instep with file" always seems to be grey-ed out!)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;What's worse is that when you look at a query, or change the query definition, Excel silently resets the parameters to some defaults. Losing whatever you had. This can screw up formatting and make the standard "prompt for values" pop-up at execution time. No good if your spreadsheet is being run by the (useless) Task Scheduler at 3 in the morning.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Basically, leave well alone.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Which is a problem when you're trying to change a spreadsheet which uses them. One which refreshes data on the Load event and just doesn't work if that doesn't happen.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;My latest cunning solution (attempt) is to edit the file outside of Excel. As you know, the new 'x' formats (.xlsx/m and .docx/m) are really zip archives with the data described in XML format within that archive.&amp;nbsp; The data connections are in a connections.xml file in the 'xl' folder. Looking at that it's fairly easy to make the necessary changes, without Excel getting a chance to 'help' you be auto-updating lots of other things.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;I'm hopeful that there's no checksum in the file contents that verify whether the archive has been tampered with. I suspect not; these are standard zip archives I believe.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-7214904469084090264?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/7214904469084090264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=7214904469084090264' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/7214904469084090264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/7214904469084090264'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/02/editing-xls-files-with-embedded-web.html' title='Editing XLS files with embedded Web Queries...'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-8453093305485321194</id><published>2011-01-27T23:09:00.000Z</published><updated>2011-01-27T23:09:29.000Z</updated><title type='text'>Curvy Corners in IE</title><content type='html'>Have been fighting with the lack of CSS3 compatibility in IE8 ... and not sure what will be there in IE9.  Just like 'pure' curved DIV corners rather than faking it with background images.&lt;br /&gt;&lt;br /&gt;Opera, Firefox, and the delightful Epiphany all do them natively, but IE, grrrrrr ...&lt;br /&gt;&lt;br /&gt;Several options tried, and my results are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;curvycorners (js) : initially promising but event redraw costly and occasional errors popping up&lt;/li&gt;&lt;li&gt; border-radius : uses .htc/vml but only handles one configuration for each corner, and seems to not handle re-draws properly&lt;/li&gt;&lt;li&gt;DD-roundies : similar but more complete version of above [not tried]&lt;/li&gt;&lt;li&gt;PIE/CSS3 : again, an htc/vml solution and appears to work beautifully, adding most all of CSS3's commonly used features to IE&lt;/li&gt;&lt;/ul&gt;So, my conclusion is to go for PIE. It lets the other browsers get on with it, whilst supporting CSS3 natively from within your CSS - so less intrusive than most other options. I now have Firefox and IE displaying almost identically without any fudged HTML or CSS. Yay.&lt;br /&gt;&lt;br /&gt;Final tip for XP Firefox users - switch on ClearType if you have an LCD display. Enables the sub-pixel smoothing across Windows that IE uses. Be rid of those spindly letters!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-8453093305485321194?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/8453093305485321194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=8453093305485321194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/8453093305485321194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/8453093305485321194'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/01/curvy-corners-in-ie.html' title='Curvy Corners in IE'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-1073248880958067462</id><published>2011-01-13T20:52:00.000Z</published><updated>2011-01-13T20:52:56.724Z</updated><title type='text'>Why Cloud Computing isn't</title><content type='html'>There's been a lot of talk over the past couple of years regarding 'The Cloud' - people advocating the use of it either within the realms of business or personal computing, as a means of reducing costs and enabling anyone to have their own virtual data centre.&lt;br /&gt;&lt;br /&gt;However, that utopia isn't really the case, is it? Cloud computing by that standard is still some way off, and might never really arrive. The idea of The Cloud marketed to us is one of your computer, your data, being somehow "out there" in some floating opportunity, scalable and configurable at a whim. The reality is that the majority of 'Cloud' suppliers are the same people who have been selling server-space and virtual servers for the past 5 years. All we're doing is buying a re-branded offering from them. There's no amorphous 'cloud'; you buy cloud-space and you can go look at the servers you are running on - touch them, feel them, and - most importantly - have them turned off. Have your cloud dissolved. Just ask Wikileaks ... how did their Amazon cloud work out for them? Turns out that rather than being "out there" it was on a collection of Amazon owned servers. Not a worldwide entity, but very firmly based on US soil, and able to be switched off.&lt;br /&gt;&lt;br /&gt;In a true 'Cloud' the data and processors would be truly distributed, and replicated across multiple nodes not located in any single country. It would be no more in one place than in any other. A bit like an internet on top of our current one. And if you tried to switch off a server &lt;i&gt;here&lt;/i&gt; another would take its place &lt;i&gt;there&lt;/i&gt;. Imagine - not just the internet everywhere, but all the web pages everywhere too. A web of collected nodes all providing data and processing services, owned and controlled by no-one. TBL's vision, just extended beyond the communications level.&lt;br /&gt;&lt;br /&gt;Real Cloud Computing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-1073248880958067462?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/1073248880958067462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=1073248880958067462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/1073248880958067462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/1073248880958067462'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2011/01/why-cloud-computing-isnt.html' title='Why Cloud Computing isn&apos;t'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-847687525921917499</id><published>2010-10-20T15:30:00.002+01:00</published><updated>2010-10-20T15:30:56.628+01:00</updated><title type='text'>Just imagine ...</title><content type='html'>If 'move' statements actually moved stuff, rather than copying it!&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-847687525921917499?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/847687525921917499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=847687525921917499' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/847687525921917499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/847687525921917499'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2010/10/just-imagine.html' title='Just imagine ...'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-769172815528599464</id><published>2010-10-19T16:57:00.002+01:00</published><updated>2010-11-01T17:10:19.124Z</updated><title type='text'>Web Design reminders...</title><content type='html'>Gosh, old IE and Firefox don't play well together.&lt;br /&gt;&lt;br /&gt;Mental notes(!):&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt; IE prefers any events to be declared on the INPUT elements (e.g. SELECT) rather than on the FORM object&lt;/li&gt;&lt;li&gt;IE doesn't trigger an 'onchange' event for a radio button until you click elsewhere on the form(!) To make it work in both IE and FF, use 'onclick'.&lt;/li&gt;&lt;/ul&gt;And probably many more besides.&lt;br /&gt;&lt;br /&gt;Also do remember that IE works more to standards if you include a correct HTML header (conforming) tag such as:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-769172815528599464?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/769172815528599464/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=769172815528599464' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/769172815528599464'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/769172815528599464'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2010/10/web-design-reminders.html' title='Web Design reminders...'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-3419474963298869749</id><published>2010-06-04T22:54:00.001+01:00</published><updated>2010-06-04T22:56:36.773+01:00</updated><title type='text'>Appraising isn't a level playing field</title><content type='html'>So we've all had those periodic performance appraisals ... objectives setting, seeing how we've done against the last set of objectives and so on, making sure those objectives are S*M*A*R*T of course(!)&lt;br /&gt;&lt;br /&gt;... well, my problem with this is that it's not really a level playing field. Sure, let's agree on some objectives for the future, and see how we've done against them; but not all objectives were created equal.&amp;nbsp; It's kind of like saying, "Hey Fred, you need to get Jim to run the length of Britain in two days", and that becomes Fred's objective. So, Fred's objective is to tell Jim to run the length of Britain, and Jim's objective is to run the length of Britain in 2 days.&amp;nbsp; Now, it seems to me that Fred is likely to achieve his objective, so well done Fred. And Jim - well, not so likely. If we are measuring performance against objectives then Jim fails, and Fred succeeds.&lt;br /&gt;&lt;br /&gt;Okay, in reality Jim is unlikely to agree to that objective, but more realistic cases are commonplace. Your job is to manage me whilst I build a new social network application; my job is to build the application. Is it fair that we both get judged in the same way against those objectives?&amp;nbsp; How often have you seen 'objective complexity' be included in the assessment?&amp;nbsp; Should it?&lt;br /&gt;&lt;br /&gt;I think it's a bit like Olympic diving competitions. The dive has a difficulty level and that sets how high a mark you can actually achieve. Even if you do the perfect dive at a difficulty of 2.3, you'll still not perform to the grade of someone doing a decent dive of difficulty 3.7.&amp;nbsp; The easy objectives should offer less reward is all I'm saying.&amp;nbsp; But have you seen this in practice?&amp;nbsp; Who goes around normalising the objectives, rather than normalising the performance grades?&lt;br /&gt;&lt;br /&gt;Let's even things out by recognising that some things are harder to achieve than others.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-3419474963298869749?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/3419474963298869749/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=3419474963298869749' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/3419474963298869749'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/3419474963298869749'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2010/06/appraising-isnt-level-playing-field.html' title='Appraising isn&apos;t a level playing field'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-8530563813221729044</id><published>2010-02-01T17:45:00.000Z</published><updated>2010-02-01T17:45:04.989Z</updated><title type='text'>No dirty linen to learn from</title><content type='html'>&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;Following on from my previous post, I think there's one other important aspect of the 'lack of software permanence' - it's un-physical nature. When we make mistakes, it's general for us to learn from them. And not only us, but others who see our mistakes. So, an engineer can learn not only from their mistakes but from the mistakes of others they come across. And these mistakes are obvious - they're in your face and undeniable.&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;However, for software, we erase our mistakes. They are gone. For good. And not only lost to the author, but to any others who might have learned from them. Again, destroying that which we create seems to lead to a lack of general improvement in the 'art' of software engineering.&amp;nbsp;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;What's that Santayana quotation -&amp;nbsp;&lt;/div&gt;&lt;blockquote&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;em&gt;Those who do not learn from history are doomed to repeat it&lt;/em&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;How many software projects have you been involved with where the same mistakes are made over and over again? Is the skill in software development increasing in the same manner of collective best-practise prevalent in other disciplines, or are we successively&amp;nbsp; repeating failures, and hitting only lower and lower grades ...&lt;/div&gt;&lt;div style="font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-8530563813221729044?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/8530563813221729044/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=8530563813221729044' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/8530563813221729044'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/8530563813221729044'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2010/02/no-dirty-linen-to-learn-from.html' title='No dirty linen to learn from'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-6710669209879932118</id><published>2010-01-21T00:36:00.006Z</published><updated>2010-01-21T01:04:55.112Z</updated><title type='text'>The Preservation of Software as Art</title><content type='html'>&lt;span style=";font-family:trebuchet ms;font-size:100%;"  &gt;I remember way back when I was taught the difference between 'hardware' and 'software':&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;    "If you can kick it, it's hardware, otherwise it's software." &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-family: trebuchet ms;"&gt;... and that's the problem. Software, unlike some work of art lacks any physical form. You can't scrape off a landscape scene to reveal some hidden masterpiece - once the code is gone, it's gone for good.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt;Okay - yes - what am I doing, mixing 'art' and 'software' in the same sentence. Most everyone who looks at the majority of software knows it's nothing 'aesthetic' and certainly not 'art'. But that's not always the case. Kind of like those Microsoft ads, us geeks know that at some point in the future, software design &lt;/span&gt;&lt;span style="font-style: italic; font-family: trebuchet ms;"&gt;will&lt;/span&gt;&lt;span style="font-family: trebuchet ms;"&gt; be seen as sexy. There will be a time when the creative process of solving such and such a problem, or designing &lt;/span&gt;&lt;span style="font-style: italic; font-family: trebuchet ms;"&gt;that&lt;/span&gt;&lt;span style="font-family: trebuchet ms;"&gt; process will be viewed as something more refined than mere(!) engineering (or, possibly, considered on a par with traditional engineering). And by then, I wonder what will have been lost?  How many designs, systems, applications, architectures, will have been erased, dumped, deleted, lost forever to the code heaven where all lost codes go? Already, how many pre-y2k systems were suitably elegant, and sophisticated to deserve more than the fate they suffered?  True. Not all. Maybe not even 'many', but some - yes, certainly some I'd think.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;"&gt;So, should we be preserving these systems, rather than casually erasing them? How many 'legacies' should we be losing, and how many preserving? I don't mean 'maintaining', just moth-balling for future generations. For those yet to come. At least to learn from our mistakes (lest be destined to repeat them). I bet Microsoft still have Windows 3.0 available, but how many lines of business systems built in the 70s are still around somewhere? I know for certain that incredibly sophisticated and complex applications I have worked on are now no more. And literally no more. There presence lost from the software world; no longer in the physical world. No mark left, and no possibility of resurrection. Newer isn't always better; and even if it is better, then what came before isn't automatically irrelevant.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: trebuchet ms;" &gt;So, a museum of software. More than simply 'oldversion.com'.  A celebration of what came before. A collection worth treasuring. Worth keeping. A testament to the endevour that came before. Surely, we should not be casually destroying this art?&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-6710669209879932118?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/6710669209879932118/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=6710669209879932118' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/6710669209879932118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/6710669209879932118'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2010/01/preservation-of-software-as-art.html' title='The Preservation of Software as Art'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-63695628088483801</id><published>2009-10-08T23:35:00.002+01:00</published><updated>2009-10-08T23:42:14.887+01:00</updated><title type='text'>Micro Men</title><content type='html'>... or the history of the home micro-computer in the UK.&lt;br /&gt;&lt;br /&gt;A fascinating programme on BBC4 about the birth of the home computer, focussing on the battles between Clive Sinclair and ex-employee Chris Curry, who co-founded Acorn Computers.&lt;br /&gt;&lt;br /&gt;Very much a walk down memory lane ... the Tandy TRS-80; Commodore Pet; Sharp MZ-80K were all around before the idea of true personal home computers arrived. Heralded by Sinclair's ZX80 (with shrinking screen as you used up the memory), but succeeded ultimately by Acorn's Atom, and then the BBC Micro. Back in the days when a 2.3Hz 6502 with 8k of RAM was seen as ground-breaking. I remember living through this, and the plethora of competing home computers.&lt;br /&gt;&lt;br /&gt;Of course, both Sinclair and Acorn eventually fell to the mighty mass-market production of IBM-PCs, and their clones, but out of Acorn came it's ARM chip (a RISC CPU originally called the 'Acorn RISC Machine', then 'Advanced RISC Machine' once separated from its parent) and that low-energy user is now the most used CPU in the world, powering almost all mobile devices.&lt;br /&gt;&lt;br /&gt;A warm look at the days of invention and innovation, when England led the way in new technology.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-63695628088483801?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/63695628088483801/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=63695628088483801' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/63695628088483801'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/63695628088483801'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2009/10/micro-men.html' title='Micro Men'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-1603030997633047840</id><published>2009-08-26T16:24:00.003+01:00</published><updated>2009-08-26T16:28:29.065+01:00</updated><title type='text'>Database Design</title><content type='html'>...is something often done poorly, but let's not get onto that right now.&lt;br /&gt;&lt;br /&gt;Consider throwing out your DBMS and just employ a lot of people to read through card decks. How about that as a solution?  Well, after a while I guess each person would learn to deal with the requirements they face - they would probably start ordering their decks in a "most frequently accessed" order. In fact, the order itself would then yield useful information.&lt;br /&gt;&lt;br /&gt;Back in our automated world, when you consider what order (primary key?) to assign to a table, rather than 'alphabetical' or 'geographical', why not consider 'access frequency' as part of your key. Something the database knows about, and something that helps you put the most used cards "at the front" (whatever that might mean).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-1603030997633047840?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/1603030997633047840/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=1603030997633047840' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/1603030997633047840'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/1603030997633047840'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2009/08/database-design.html' title='Database Design'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-104869450942163789</id><published>2008-02-18T21:24:00.003Z</published><updated>2008-02-18T21:30:17.592Z</updated><title type='text'>On new technology</title><content type='html'>... does technolgy lead the products, or the products lead the technology?&lt;br /&gt;&lt;br /&gt;Maybe, as most things in life, the answer isn't simply one or the other, but a combination of both and other factors (yes, there are no simple answers).&lt;br /&gt;&lt;br /&gt;How often is a product generated from the desire to see a new technology in action? Where do all the blogs come from - is this led by the ability to host/publish blogs in different ways - built into many technologies; or is the desire to blog pushing the appearance of such technologies?&lt;br /&gt;&lt;br /&gt;Well, there's the initial blog appearance - based on non-appealing software, then the idea of a market opporunity seized by the entrepreneur, then the sheep stampede of bloggers which follow, and then the more-blog software avalanche.&lt;br /&gt;&lt;br /&gt;It's a symbiosis, not a horse and cart, bud!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-104869450942163789?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/104869450942163789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=104869450942163789' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/104869450942163789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/104869450942163789'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2008/02/on-new-technology.html' title='On new technology'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-2268105574196111753</id><published>2008-02-14T11:23:00.001Z</published><updated>2008-02-14T11:23:49.652Z</updated><title type='text'>I am ill</title><content type='html'>And hating it :-(&lt;br /&gt;&lt;br /&gt;Hopefully will soon recover.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-2268105574196111753?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/2268105574196111753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=2268105574196111753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/2268105574196111753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/2268105574196111753'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2008/02/i-am-ill.html' title='I am ill'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8115611867353523040.post-4131763843462878330</id><published>2007-12-05T11:38:00.000Z</published><updated>2007-12-05T11:40:04.257Z</updated><title type='text'>First Posting</title><content type='html'>Testing out the blog site!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8115611867353523040-4131763843462878330?l=blog.mike-flint.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://blog.mike-flint.com/feeds/4131763843462878330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8115611867353523040&amp;postID=4131763843462878330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/4131763843462878330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8115611867353523040/posts/default/4131763843462878330'/><link rel='alternate' type='text/html' href='http://blog.mike-flint.com/2007/12/first-posting.html' title='First Posting'/><author><name>MainyMike</name><uri>http://www.blogger.com/profile/14073595786043830608</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='19' src='http://3.bp.blogspot.com/_z5TWijwsqAE/S1iqWSurLMI/AAAAAAAAAAM/XS53Tfv9K-4/S220/beach.jpg'/></author><thr:total>0</thr:total></entry></feed>
