<?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-5082828566240519947</id><updated>2012-02-01T23:18:34.187Z</updated><category term='carpc'/><category term='mcp'/><category term='openlayers'/><category term='active directory'/><category term='javascript'/><category term='web'/><category term='partimage'/><category term='books'/><category term='gnucash'/><category term='pidgin'/><category term='hosting'/><category term='gpx'/><category term='lvm'/><category term='open source'/><category term='niggle'/><category term='dhtml'/><category term='c#'/><category term='firefox'/><category term='dell'/><category term='troubleshooting'/><category term='ceramics'/><category term='agile'/><category term='git'/><category term='mcts'/><category term='best practice'/><category term='inspiron 8500'/><category term='animation'/><category term='journal'/><category term='flickr photos'/><category term='script'/><category term='windows'/><category term='tdd'/><category term='mum'/><category term='macro'/><category term='irc'/><category term='code'/><category term='invention'/><category term='csv'/><category term='review'/><category term='learning'/><category term='training'/><category term='rant'/><category term='hardware'/><category term='laptop'/><category term='backup'/><category term='linux'/><category term='NUnit'/><category term='business'/><category term='oss'/><category term='jQuery'/><category term='mysql'/><category term='ntfs'/><category term='photography'/><category term='howto'/><category term='shameless plug'/><category term='proprietary'/><category term='games'/><category term='django'/><category term='bash'/><category term='starfighter'/><category term='ideas'/><category term='composite video'/><category term='vb'/><category term='gps'/><category term='visual studio'/><category term='wip'/><category term='gpsprune'/><category term='certification'/><category term='sys admin'/><category term='sql'/><category term='opinion'/><category term='software'/><category term='drm'/><category term='html'/><category term='coding'/><category term='microsoft'/><category term='dev'/><category term='asp.net'/><category term='project management'/><category term='fun'/><category term='ubuntu'/><category term='project'/><category term='critique'/><category term='kdiff3'/><category term='data'/><category term='nvidia'/><category term='vista'/><category term='bugzilla'/><category term='svn'/><title type='text'>Tim Abell's blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>56</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-3790910591580830225</id><published>2012-01-25T21:22:00.001Z</published><updated>2012-01-25T21:22:26.819Z</updated><title type='text'>The BBC and the bouncing emails</title><content type='html'>For the record, this is the staggering response I received from the BBC's iPlayer support when I helpfully let them know that the email address they use as sender when responding to feedback sent through their support web form is non-deliverable.&lt;br /&gt;&lt;br /&gt;I think it speaks for itself. You would at least think they would set the sender address to "noreply-werenotlistening-lalala@bbc.co.uk" so you wouldn't waste time composing a response. And if you've been through the web form, you will know that filling it out once is okay, but to use it to reply? Give over!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;-------- Original Message -------- &lt;/span&gt;&lt;table style="color: rgb(51, 0, 153);" class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;Subject: &lt;/th&gt;&lt;td&gt;BBC iPlayer - Case number CAS-1258137-Q271CZ&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;Date: &lt;/th&gt;&lt;td&gt;24 Jan 2012 10:19:09 +0000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;From: &lt;/th&gt;&lt;td&gt;bbc_iplayer_website@bbc.co.uk &amp;lt;bbc_iplayer_website@bbc.co.uk&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;To: &lt;/th&gt;&lt;td&gt;tim abell &amp;lt;tim@timwise.co.uk&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;  &lt;/span&gt;&lt;br style="color: rgb(51, 0, 153);"&gt;&lt;span style="color: rgb(51, 0, 153);"&gt;Dear Mr Abell &lt;/span&gt;&lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; Reference CAS-1258137-Q271CZ&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; Thank you for contacting the BBC iPlayer support team.&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; I understand you’re unhappy that the reply email you had sent to our email bounced.&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; I’m afraid it is not possible to reply to our email because we deal with  over a million audience contacts every year and we have to ensure they  can be efficiently tracked using our handling system and therefore for  every correspondence you need to fill the webform. In addition, our  complaints, BBC iPlayer and general enquiries webforms ask for essential  information such as channel, programme name and transmission date which  means we don't have to write back to people unnecessarily.  Using a  webform also guarantees we can match a return contact up with the  previous contact from that person without the need to cross-check  thousands of unformatted emails which would then have to be manually  transferred into the tracking system.&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; We try to restrict public email inbox addresses where possible because  we receive millions of 'spam' e-mails and a return email address would  attract and generate even more.  Junk mail costs the BBC a considerable  amount of money because every email has to be checked before we can  delete them as it’s not always easy to distinguish them from a genuine  email. &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; I appreciate this may be annoying, but we did not take this decision  lightly.  Our policy takes into account what is operationally efficient  and avoids the need to employ additional staff to process incoming  emails.  I would therefore ask that you please follow the instructions  in the reply you received and use our online form at  www.bbc.co.uk/complaints. Your email will then be passed to a member of  our team for further investigation and reply.&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; Once again thank you for contacting BBC iPlayer.&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; Kind Regards&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; Usha Devi Peri&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; BBC Audience Services&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; www.bbc.co.uk/iplayer&lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; &lt;/p&gt; &lt;p style="color: rgb(51, 0, 153);"&gt; NB This is sent from an outgoing account only which is not monitored.  You cannot reply to this email address but if necessary please contact  us via our webform quoting any case number we provided.&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;------&lt;br /&gt;&lt;/p&gt;&lt;p style="color: rgb(51, 0, 153); text-align: left;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;And here is the bounce, so you can see why I thought they had made a mistake:&lt;/span&gt;&lt;/p&gt;&lt;table style="color: rgb(0, 102, 0);" class="moz-email-headers-table" border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;Subject: &lt;/th&gt;&lt;td&gt;Undelivered Mail Returned to Sender&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;Date: &lt;/th&gt;&lt;td&gt;Sat, 21 Jan 2012 07:42:07 -0500 (EST)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;From: &lt;/th&gt;&lt;td&gt;MAILER-DAEMON (Mail Delivery System)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th nowrap="nowrap" valign="BASELINE" align="RIGHT"&gt;To: &lt;/th&gt;&lt;td&gt;tim@timwise.co.uk&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt; &lt;/table&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;  &lt;/span&gt;&lt;br style="color: rgb(0, 102, 0);"&gt;&lt;span style="color: rgb(0, 102, 0);"&gt; &lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;This is the Postfix program at host mxout-07.mxes.net.  I'm sorry to have to inform you that your message could not be delivered to one or more recipients.  Here is the reason why the message could not be delivered.  &amp;lt;bbc_iplayer_website@bbc.co.uk&amp;gt;: host     cluster1.eu.messagelabs.com[195.245.231.99] said: 550-Invalid recipient     &amp;lt;bbc_iplayer_website@bbc.co.uk&amp;gt; 550 (#5.1.1) (in reply to RCPT TO command)&lt;/span&gt;&lt;span style="color: rgb(51, 0, 153);"&gt; &lt;/span&gt;&lt;p style="color: rgb(51, 0, 153);"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-3790910591580830225?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/3790910591580830225/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=3790910591580830225' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3790910591580830225'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3790910591580830225'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2012/01/bbc-and-bouncing-emails.html' title='The BBC and the bouncing emails'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2568814673689579544</id><published>2012-01-17T03:21:00.013Z</published><updated>2012-01-17T09:56:42.349Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='project management'/><category scheme='http://www.blogger.com/atom/ns#' term='niggle'/><title type='text'>The trouble with agile is it's a bit too good</title><content type='html'>&lt;a href="http://www.flickr.com/photos/tim_abell/6606813059/"&gt;&lt;img src="http://farm8.staticflickr.com/7172/6606813059_304696d41b_m.jpg" alt="Picture of a waterfall in Wales" style="float:right;margin: 0 0 1em 1em" /&gt;&lt;/a&gt; So you've gone &lt;span style="font-weight: bold;"&gt;Agile! &lt;/span&gt;Woo! Well done! You've escaped the last millennium's software practices at last! And boy do you feel in &lt;span style="font-style: italic;"&gt;control&lt;/span&gt; at last! The iterations are flying past, the story points are getting done at a rate you could only have dreamt of. No longer do you wonder what your development team are up to for months at a time, with that nagging feeling that you are pouring money in and you're not getting best "value".&lt;br /&gt;&lt;br /&gt;Seems like some kind of productivity utopia doesn't it?&lt;br /&gt;&lt;br /&gt;But there's still something not quite right isn't there? Are the technical team &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; moaning (pah, that's just technical people isn't it? ... or is it? they often have a point, just usually a difficult one). There's this thing they are always going on about, maybe it changes day to day, maybe it's the same. Maybe it doesn't seem well enough defined to &lt;span style="font-style: italic;"&gt;deserve&lt;/span&gt; a story. Maybe it just some long term gripe that's never quite as important as all those other  items in the backlog that have a priority of "O.M.G. if we don't do this by the 14th of this month we're all DEAD!!$$£##£!!!", so it keeps getting barely scheduled and certainly never &lt;a href="http://codebetter.com/jeremymiller/2006/04/14/code-complete-is-a-lie-done-done-done-is-the-truth/"&gt;done, done, done&lt;/a&gt;! (Okay, calm down excitable agile people, saying it once is fine.) But hey &lt;span style="font-style: italic;"&gt;that's the process&lt;/span&gt; so it must be right, if it doesn't make it, it &lt;span style="font-style: italic;"&gt;can't&lt;/span&gt; have been that important. Can it?&lt;br /&gt;&lt;br /&gt;Well, it's time for some unscientific theorizing.&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/6597177893/"&gt;&lt;img src="http://farm8.staticflickr.com/7151/6597177893_1b72a38092_m.jpg" alt="Atomospheric picture of clouds" style="margin: 1em" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;I've been doing a bit of job hopping recently (nothing on the scale of contracting, but I've seen a few different things, and a few different approaches to project management). And I've noticed something in the two examples of agile (&lt;a href="http://en.wikipedia.org/wiki/Scrum_%28development%29"&gt;SCRUM&lt;/a&gt; specifically) I've been close to that bothers me.&lt;br /&gt;&lt;br /&gt;&lt;div style="float:right; font-size: 1.5em; width: 10em;text-align: justify;margin:0 0 1em 1em"&gt; “When it comes to the detail of the work, the manager is relying on the expertise of their staff.”&lt;/div&gt;As a bit of background, remember that software development is a highly skilled job. Software development is one of those funny worlds of work where the employee inevitably knows more than the manager. The manager will likely have more broad context (I really hope so, for that matter), but when it comes to the detail of the work, and the &lt;span style="font-style: italic;"&gt;right&lt;/span&gt; thing to do, the manager is relying on the expertise of their staff to make detailed decisions. This is as it should be given that the developers spend all their working hours, often more, immersed in the detail, keeping up with the current technology, and becoming ever more skilled at the job. Even if a manager is initially just as knowledgeable in the field as their staff, just by virtue of spending more time managing than doing (nothing wrong with that of course), they will inevitably become less knowledgeable than their developers over time (whether they admit it or not, and don't we all know someone who still thinks they know everything!)&lt;br /&gt;&lt;br /&gt;Okay, I'll get to the point already (this had better be good).&lt;br /&gt;&lt;br /&gt;If you have moved from one of the less well controlled project management methods (including  the "general panic" approach), then you may or may not have realised that &lt;span style="font-weight: bold;"&gt;a fundamental shift in power has occurred&lt;/span&gt;. The ability to direct the way your development team spends their time has moved more into the hands of the manager, and away from the hands of the individual developers. On the whole I consider this a good thing, as individual developers deciding to do things by fiat doesn't always help a company with its immediate deadlines, and there is a much improved ability under the new regime to pick a goal and get there more or less on time (unless you are just paying lip service to SCRUM), with fewer nasty surprises along the way (such as, the good old "where did that month go?" experience). In the past, management could give the developers direction one month to the next, but day to day was a bit of a mystery, and without SCRUM in place too it was much overhead to cope with. Now, &lt;span style="font-style: italic;"&gt;every&lt;/span&gt; day is accounted for. Life is good, the company gets more of what it asks its developers for.&lt;br /&gt;&lt;br /&gt;Every developer I have worked with has wanted to do a good job for the company they are working for. And they have all been generally competent at both coding, and interacting with management in getting the job done. So if they are good people, and we are so much more "productive" now, then why were they &lt;span style="font-style: italic;"&gt;wasting&lt;/span&gt; all this time before? Well, to an extent you can explain the improvements by the elimination of some of the tail chasing exercises that happen under less disciplined approaches to project management. But that's not quite enough. There's something else, and &lt;span style="font-weight: bold;"&gt;it's a question of perceived priorities&lt;/span&gt; and the effect they have on what gets done.&lt;br /&gt;&lt;br /&gt;When you have your head under the bonnet, you'll notice all the leaks and all the frayed cables. And as anyone who's taken their car to a garage will know, the mechanic can always find something to suck their teeth about and charge you an extra £150. But when you are just driving the car it all seems just peachy till service time. But why do you give in and pay up for that thing you've never heard of? Surely if the car was fine when you were driving, then it &lt;span style="font-style: italic;"&gt;must&lt;/span&gt; be okay? Well, I don't know about you, but for me it's the fear of ending up as a pile of &lt;span style="color: rgb(153, 0, 0);"&gt;tomato ketchup&lt;/span&gt; on the inside of my windscreen when I finally find out why that thing I can't even name was actually important. So how is this a good analogy? No-one ever died from bad software, right? Well the point is, the mechanic is skilled (&lt;span style="font-style: italic;"&gt;like the developer&lt;/span&gt;), and I am not (&lt;span style="font-style: italic;"&gt;like the manager&lt;/span&gt;). Like the manager, I have to decide which things to spend my money on and which things to pretend I know about and leave till the MOT fails.&lt;br /&gt;&lt;br /&gt;Software developers, being skilled tradespeople, always have an eye on the long term, and will always be balancing the current panic from the sales department against what is good for the company in the long run. In the past, when you used to lose months at a time, it was often partly because the developers were taking some time to look after the company's long term interests. In hindsight it is easy to justify the long term work that was done with some glib comment, as it's no longer really up for discussion; you can't get the time back after all. But imagine if all these long term things had to be justified &lt;span style="font-style: italic;"&gt;before&lt;/span&gt; they were done, even if the manager doesn't know what on earth the developers are talking about. Well you know what, a lot of it wouldn't get done, and the developers who really care about your long term future (i.e. those you haven't ground down yet into despondency yet by ignoring them for years on end), would get narked. If it's hard to "put a business case for" then a lot of good developers I know will just not bother, after all they don't have to save management from themselves, that wasn't in the job specification, and people don't like being saved from themselves anyway. Unfortunately, this is exactly the change that moving to SCRUM introduces. Developers can no longer "just do" something that takes more than a day, no matter how much it needs doing in the long run, as it will be blindingly obvious at the daily stand-ups that they are not sticking to tasks, and are going to make an iteration miss its target. After all each iteration is likely already chock full of "&lt;a href="http://en.wikipedia.org/wiki/MoSCoW_Method"&gt;must haves&lt;/a&gt;", and even if a developer puts the effort in to get a long term piece of work into an iteration, it will always end up lower priority than user stories for customer visible deadlines, and therefore likely still not get done (unless you are getting your velocity right, which of course you should be).&lt;br /&gt;&lt;br style="color: rgb(0, 51, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Interlude. &lt;/span&gt;You may now hum to yourself for a bit before I attempt to tell you how to fix it.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/6495790775/"&gt;&lt;img src="http://farm8.staticflickr.com/7005/6495790775_7190968d21_m.jpg" alt="Atomospheric picture of clouds" style="margin: 1em" /&gt;&lt;/a&gt;&lt;/div&gt;So what to do? In a way maybe it's no different to the car analogy. Make sure you (management) get enough long term stuff into the iterations, and give them just as much priority as anything else. Make sure they get &lt;span style="font-style: italic;"&gt;done&lt;/span&gt;! Just as if they were a short term deadline. Then in the long run, the wheels won't fall off your software, at least not while you're driving. &lt;span style="color: rgb(102, 102, 102);font-size:85%;"&gt;(This blog post contains no warranty, road conditions my vary, any number of factors may cause the wheels to fall off your software. Especially if driven over rough specifications.)&lt;/span&gt; Make sure your team of developers know that you are committed to this so that they do actually come forward with the things they &lt;span style="font-style: italic;"&gt;know&lt;/span&gt; need to be done sooner or later. (If you don't know about it you certainly can't get it fixed.) Perhaps you could create a separate long term plan with the help of the team that provides for long term needs, giving it real deadlines that are as immovable as whatever conference you are showing at next. If you have to justify it to others you can say "because the long term is just as important to our business as the now"! Have the courage of your convictions. Back the long term as well as the short term. Always have an eye on the build up of outstanding long term items (c.f. &lt;a href="https://en.wikipedia.org/wiki/Technical_debt"&gt;technical debt&lt;/a&gt;). If the long term plan doesn't look like it fits with what you &lt;span style="font-style: italic;"&gt;have&lt;/span&gt; to deliver day to day, then maybe you need to step back and look at your software architecture as a whole, or the resourcing in your team. I would suggest a practical plan: set a percentage of time that will be spent on the long the term items, say 10%, which is ring fenced for use by the technical experts (the developers), for making sure the long term needs of your software are looked after.&lt;br /&gt;&lt;br /&gt;Sooner or later, if things run their new agile course, the chickens will come home to roost, and you'll start to wonder why it's taking longer and longer to get those features out, or more time will be lost to bugs, or things will just start to outright fail. So I urge you to think about the long term and not forget that the manager is not the expert in the detail - that's what your developers are there for. So listen to your techies and the advice they have on the balance of priorities, and take that into account when creating and prioritising your backlog. You will have a happier team and happier software as a result.&lt;br /&gt;&lt;br /&gt;So in summary:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Moving to agile is excellent, but prevents your technical experts from quietly fixing things for you to the same extent.&lt;/li&gt;&lt;li&gt;Don't forget the long term in the excitement of getting features done, done, done!&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2568814673689579544?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2568814673689579544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2568814673689579544' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2568814673689579544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2568814673689579544'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2012/01/trouble-with-agile-is-its-bit-too-good.html' title='The trouble with agile is it&apos;s a bit too good'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-5718834994106059896</id><published>2012-01-11T09:05:00.009Z</published><updated>2012-01-11T10:53:24.424Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='critique'/><title type='text'>Git, Windows and Line endings</title><content type='html'>&lt;a href="http://www.flickr.com/photos/tim_abell/6375201587/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 75px; height: 75px;" src="http://farm7.staticflickr.com/6237/6375201587_3a4b7d4a19_s.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;I have come to the unfortunate conclusion that git is not the perfect tool for teams developing exclusively on Windows. And by that I mean, I cannot recommend it unconditionally as I would like to be able to do.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The main competition I would be considering is Microsoft's TFS.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have had plenty of experience working with git under windows (as well as on linux), and what follows are the three reasons I can't wholeheartedly recommend git to a pure windows team. There are of course many reasons to avoid the alternatives, but that is outside the scope of what I wanted to say here.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just for the record, in spite of these flaws, I still think git is the best thing since sliced bread.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;File renaming&lt;/h4&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is an outright bug that unfortunately the msysgit developers have chosen not to address (as is their prerogative), and I don't have the resources needed to provide a patch of sufficient quality or run my own variant of msysgit.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://code.google.com/p/msysgit/issues/detail?id=228"&gt;Issue 228, failure to rename a file&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The simple test is to change the case of a file's name, which fails, however most obvious workaround (rename to another file name in one commit, and back again in another) actually makes the problem worse. This is because the bug also affects checkouts, so when git on another team member's machine attempts to update the working copy directly from its previous state directly to the requested revision (usually the latest), the "checkout" fails half way through leaving the team member flummoxed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is a particularly insidious bug for a team. You will generally have some people who are stronger with git (or pick it up quickly), and some who are not interested or struggle with the new system. Unfortunately if your team trips over this bug, *every* team member will have to work out how to get past it, and it is not immediately obvious from the symptoms what the problem might be or how to solve it. It also leaves the victim's source directory in an inconsistent state, so if they try to ignore the problem and carry on they will get into more of a pickle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Having to notify every member of your team that you have changed the case of a file and point them to a workaround is hardly going to endear them to their new fangled source control "git".&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;A real world example of why this might happen:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;File in your source tree that has been around since before you had any naming conventions: "&lt;i&gt;VATRate.cs&lt;/i&gt;" containing a &lt;i&gt;VATRate &lt;/i&gt;class. (Value Added Tax). You now enforce a naming convention where Acronyms are in Pascal case, i.e. &lt;i&gt;VatRate&lt;/i&gt;. In order to rename the class you must also rename the file, therefore &lt;i&gt;VATRate.cs&lt;/i&gt; is renamed to &lt;i&gt;VatRate.cs&lt;/i&gt;, triggering the above bug for your entire team whenever they happen to fetch (and worse every time they switch between branches that do / don't have the patch).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Line Endings&lt;/h4&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As you know from the depths of history, our beloved operating systems have chosen different line ending systems:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Mac: CR&lt;/li&gt;&lt;li&gt;Windows: CRLF&lt;/li&gt;&lt;li&gt;Linux/Unix: LF&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Git has an ingenious way of handling this, and gives you three choices for handling cross platform differences (see &lt;a href="http://linux.die.net/man/1/git-config"&gt;git config / core.autocrlf&lt;/a&gt;):&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;Leave them the hell alone (&lt;i&gt;false&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;Store them in git as LF and convert them on checkin/checkout (&lt;i&gt;auto&lt;/i&gt;)&lt;/li&gt;&lt;li&gt;convert them when you checkin a file but not on checkout (&lt;i&gt;input&lt;/i&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;Which in theory is fine and dandy, and any the first two should both be fine for a pure windows team... if it wasn't for the patch tools. It would seem that as soon as you start applying patches and using some of the more advanced tools that come with git, they introduce inconsistent line endings into checked in files. You also have an issue with the configuration being client side, so it is likely one of your team members will get the setting wrong one day and make a mess.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In my experience, neither of the first two settings are painless under windows, leaving you with a constant overhead of meaningless / noisy diffs, and time spent troubleshooting, and running tools to tidy up files that have had their line endings corrupted.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It's not a show-stopper, but it does make it harder to recommend that a team avoid TFS (for example) and use the "better" solution with all its benefits.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Unicode file handling&lt;/h4&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I may not have my facts completely straight on this one as I'm no expert in this area, so please forgive me and provide any corrections / references you can in the comments.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Visual Studio has a tendency to add a byte order marker to source files. Which as far as I know is fine. Unfortunately git then is inclined to interpret the file as binary and refuse to show diffs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(I'm a little uncertain on this one, but I have seen the symptoms first hand, and it happens more than is comfortable)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h4&gt;Footnote: Speed&lt;/h4&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Git is held up as an example of fast source control, and seems faster than anything else I've used, however it's also worth mentioning that rewriting commit histories (rebase), refreshing the status and tab-completion are (last time I checked) all significantly slower on msysgit (windows) than git on linux.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-5718834994106059896?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/5718834994106059896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=5718834994106059896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5718834994106059896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5718834994106059896'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2012/01/git-windows-and-line-endings.html' title='Git, Windows and Line endings'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2649869241370803794</id><published>2011-11-16T09:46:00.011Z</published><updated>2011-11-17T14:47:33.704Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ntfs'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>Multiple working folders for git on Windows XP</title><content type='html'>Multiple working folders for git on Windows XP (lucky me)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;It is assumed that you have a git working copy of your project already in place at &lt;i&gt;C:\code\myproject\&lt;/i&gt; and that you want another copy of your project sharing all history but with a different branch checked out at &lt;i&gt;C:\code\othercopy\&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;This is useful for:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;rapidly switching between branches where a switch would normally cause a time consuming recompile / rebuild&lt;/li&gt;&lt;li&gt;tracking the branch structure of Visual SourceSafe (which you aren't using in this century are you?) aka VSS aka Visual Source Shredder (or maybe TFS)&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;This can be achieved by use of &lt;a href="http://en.wikipedia.org/wiki/NTFS_symbolic_link"&gt;NTFS symbolic links&lt;/a&gt; (other related keywords: junction points, reparse points, hard links). Grab &lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896768"&gt;Sysinternals' Junction&lt;/a&gt; to provide access to NTFS symbolic links. Extract the contents and put &lt;i&gt;junction.exe&lt;/i&gt; on your path.&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Word of warning for NTFS symbolic links in Windows XP:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Windows Explorer in XP doesn't know about the NTFS symbolic links, and if you delete the containing folder it will delete the real copy of your linked folder (facepalm). &lt;b&gt;Take backups first! You have been warned!&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Open a command prompt and run the following commands:&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;cd c:\code\&lt;br /&gt;mkdir othercopy&lt;br /&gt;cd othercopy&lt;br /&gt;mkdir .git&lt;br /&gt;cd .git&lt;br /&gt;&lt;br /&gt;junction hooks C:\code\myproject\.git\hooks&lt;br /&gt;junction info C:\code\myproject\.git\info&lt;br /&gt;junction logs C:\code\myproject\.git\logs&lt;br /&gt;junction objects C:\code\myproject\.git\objects&lt;br /&gt;junction refs C:\code\myproject\.git\refs&lt;br /&gt;&lt;br /&gt;C:\code\othercopy\.git&amp;gt;copy C:\code\myproject\.git\* .&lt;/code&gt;&lt;/pre&gt;If you make a mistake, use "&lt;i&gt;junction -d&lt;/i&gt;" to remove the branch point you have created, &lt;b&gt;do not use explorer to delete a branch point&lt;/b&gt; as it will delete all your actual files.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can now go into C:\code\othercopy\ and switch to a different branch, eg in git-bash:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;code&gt;cd c:&lt;br /&gt;cd \code\othercopy\&lt;br /&gt;git branch mynewbranch&lt;br /&gt;git checkout -f mynewbranch&lt;/code&gt;&lt;/pre&gt;At this point you have two different checkouts sharing the same git data. Yay.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Word of warning for multiple working copies and &lt;a href="http://code.google.com/p/gitextensions/"&gt;git-extensions&lt;/a&gt;:&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Git extensions gets confused if you remove a branch that one of your working copies is on; and incorrectly shows the folder as uninitialised. To resolve this use the context menu in explorer or the console to force checkout a different branch.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;This howto was written with "&lt;i&gt;git version 1.7.6.msysgit.0&lt;/i&gt;" and &lt;i&gt;git-extensions v2.26&lt;/i&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;References / see also:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://finik.net/2010/10/24/multiple-working-folders-with-single-git-repository/"&gt;http://finik.net/2010/10/24/multiple-working-folders-with-single-git-repository/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/NTFS_symbolic_link"&gt;http://en.wikipedia.org/wiki/NTFS_symbolic_link&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://technet.microsoft.com/en-us/sysinternals/bb896768"&gt;http://technet.microsoft.com/en-us/sysinternals/bb896768&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/p/gitextensions/"&gt;http://code.google.com/p/gitextensions/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://elegantcode.com/2011/03/15/git-tfs-where-have-you-been-all-my-life/"&gt;http://elegantcode.com/2011/03/15/git-tfs-where-have-you-been-all-my-life/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/spraints/git-tfs"&gt;http://github.com/spraints/git-tfs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Scripts for creating and unlinking extra working copies:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1373136"&gt;https://gist.github.com/1373136&lt;/a&gt; - create&lt;/li&gt;&lt;li&gt;&lt;a href="https://gist.github.com/1373142"&gt;https://gist.github.com/1373142&lt;/a&gt; - remove&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2649869241370803794?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2649869241370803794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2649869241370803794' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2649869241370803794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2649869241370803794'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/11/multiple-working-folders-for-git-on.html' title='Multiple working folders for git on Windows XP'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2383499498516356796</id><published>2011-11-09T00:08:00.001Z</published><updated>2011-11-09T00:11:55.633Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='gpsprune'/><category scheme='http://www.blogger.com/atom/ns#' term='gps'/><category scheme='http://www.blogger.com/atom/ns#' term='gpx'/><title type='text'>GpsPrune file matching</title><content type='html'>&lt;a href="http://www.flickr.com/photos/tim_abell/6327537524"&gt;&lt;img style="margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 500px; height: 329px;" src="http://farm7.static.flickr.com/6215/6327537524_63e500602c.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wanted to be able to load a whole bunch of gpx traces and see which one was where on the map. I've got a basic version working thought it's a bit rough around the edges.&lt;br /&gt;&lt;br /&gt;The code is available for you to grab from &lt;a href="http://github.com/timabell/gpsprune"&gt;http://github.com/timabell/gpsprune&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And above is a pic of it in action, having opened a load of files at once and clicked on one of them in the list&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2383499498516356796?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2383499498516356796/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2383499498516356796' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2383499498516356796'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2383499498516356796'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/11/gpsprune-file-matching.html' title='GpsPrune file matching'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6215/6327537524_63e500602c_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-149678347610055760</id><published>2011-10-25T06:17:00.002Z</published><updated>2011-10-25T06:20:59.060Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='lvm'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>LVM + ReiserFS for the win</title><content type='html'>LVM + ReiserFS for the win!&lt;br /&gt;&lt;br /&gt;It's so easy to add more space&lt;br /&gt;&lt;code&gt;&lt;pre&gt;root@atom:~&lt;br /&gt;# lvextend -L +100G /dev/vg2/local&lt;br /&gt; Extending logical volume local to 200.00 GiB&lt;br /&gt; Logical volume local successfully resized&lt;br /&gt;root@atom:~&lt;br /&gt;# resize_reiserfs /dev/vg2/local&lt;br /&gt;resize_reiserfs 3.6.21 (2009 www.namesys.com)&lt;br /&gt;&lt;br /&gt;resize_reiserfs: On-line resizing finished successfully.&lt;br /&gt;root@atom:~&lt;br /&gt;# df -h /dev/mapper/vg2-local&lt;br /&gt;Filesystem            Size  Used Avail Use% Mounted on&lt;br /&gt;/dev/mapper/vg2-local&lt;br /&gt;                     200G   18G  183G   9% /media/local&lt;br /&gt;root@atom:~&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-149678347610055760?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/149678347610055760/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=149678347610055760' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/149678347610055760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/149678347610055760'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/10/lvm-reiserfs-for-win.html' title='LVM + ReiserFS for the win'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1927836286459223590</id><published>2011-10-03T10:39:00.002Z</published><updated>2011-10-03T10:41:47.394Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='sql'/><category scheme='http://www.blogger.com/atom/ns#' term='data'/><category scheme='http://www.blogger.com/atom/ns#' term='best practice'/><category scheme='http://www.blogger.com/atom/ns#' term='coding'/><title type='text'>share your test data for your project</title><content type='html'>&lt;div&gt;Thought for the day:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Completed projects should &lt;b&gt;always &lt;/b&gt;inlcude SQL scripts for creating working test data (i.e. so you can see the code in action).&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I often see difficulties creating usable test data when picking up someone else's work.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And I'd add to that, a readme file with how to use the test data.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(short blog post, but too long for a tweet!)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1927836286459223590?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1927836286459223590/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1927836286459223590' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1927836286459223590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1927836286459223590'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/10/share-your-test-data-for-your-project.html' title='share your test data for your project'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7529065114767212754</id><published>2011-08-05T21:48:00.007Z</published><updated>2011-08-10T20:54:51.819Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='invention'/><title type='text'>Simple water butt level meter</title><content type='html'>Something new for me on this blog, a physical invention.&lt;br /&gt;&lt;br /&gt;I made a prototype with an idea of making them and selling them. It's designed to satisfy a personal niggle - it annoys me taking the lids off every time I want to see if they are full or empty. I then researched patents etc and decided it was a non-starter so here it is for you to make your own and for the good of the world.&lt;br /&gt;&lt;br /&gt;It's nothing ground breaking but I'm quite pleased with it.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/6012906502/"&gt;&lt;img src="http://farm7.static.flickr.com/6130/6012906502_e434750e67.jpg" alt="a diagram of my invention" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you like here's the &lt;a href="http://www.timwise.co.uk/images/blog/water-butt-meter.svg"&gt;original svg of the diagram&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please contact me if you like this / use this, just so I know it was worth the evening I spent drawing it :-)&lt;br /&gt;&lt;br /&gt;Contact me if you want me to make you one, I could sell them through ebay if there's a demand.&lt;br /&gt;&lt;br /&gt;To make it pretty I was thinking of putting a little fisherman on top with his rod holding the string for the level meter... (this would have the practical advantage of keeping the string straighter thus avoiding some of the error introduced by the bend in the simplest version).&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;Alternatives:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.maplin.co.uk/water-level-meter-module-265562"&gt;http://www.maplin.co.uk/water-level-meter-module-265562&lt;/a&gt; - electronic remote meter, £30&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.irrigationwarehouse.com.au/category264_1.htm"&gt;http://www.irrigationwarehouse.com.au/category264_1.htm&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7529065114767212754?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7529065114767212754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7529065114767212754' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7529065114767212754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7529065114767212754'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/08/simple-water-butt-level-meter.html' title='Simple water butt level meter'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6130/6012906502_e434750e67_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1390054549969590161</id><published>2011-07-07T23:02:00.009Z</published><updated>2011-07-08T23:00:55.354Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dhtml'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='code'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Auto-expanding django formset with jQuery</title><content type='html'>As it took me quite a while to get it how I like it, here's the relevant bits for making a django formset (custom markup in a table), that automatically adds rows (formset forms) client-side / in the browser keeping up as you fill in the form.&lt;br /&gt;&lt;br /&gt;Do with the code as you wish, no licence needed.&lt;br /&gt;&lt;br /&gt;In the view (.html file server side) I have:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;@login_required&lt;br /&gt;def invoiceEdit(request, invoice_id):&lt;br /&gt;    ...&lt;br /&gt;    InlineInvoiceItemsFormSet = inlineformset_factory(Invoice, InvoiceItem, form=DeleteIfEmptyModelForm, formset=DeleteIfEmptyInlineFormSet, can_delete=True, extra=10)&lt;br /&gt;    ...&lt;br /&gt;    itemFormSet = InlineInvoiceItemsFormSet()&lt;br /&gt;    ...&lt;br /&gt;    return render_to_response('foo/edit.html', {'invoiceForm': invoiceForm, 'itemFormSet': itemFormSet, 'invoice': invoice}, context_instance=RequestContext(request))&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;In the template I have:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&gt;&lt;br /&gt; $(function() {&lt;br /&gt;  setupInvoiceFormset();&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt; var initialRows;&lt;br /&gt;&lt;br /&gt; function setupInvoiceFormset() {&lt;br /&gt;  initialRows = parseInt($('#id_invoiceitem_set-INITIAL_FORMS').val());&lt;br /&gt;  // remove all but last two empty rows&lt;br /&gt;  resizeInvoiceFormset();&lt;br /&gt;  // add handlers to all inputs to automate row adding&lt;br /&gt;  $('.invoiceItemRow :input').blur(resizeInvoiceFormset);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; const targetExtra = 2; // number of extra rows desired&lt;br /&gt;&lt;br /&gt; function resizeInvoiceFormset() {&lt;br /&gt;  // count the blank rows at the end&lt;br /&gt;  var rows = $('.invoiceItemRow').filter(':not(#templateItemRow)');&lt;br /&gt;  var totalRows = rows.length&lt;br /&gt;  var blankRows = countBlankRows(rows);&lt;br /&gt;  var targetRowCount = totalRows - blankRows + targetExtra;&lt;br /&gt;  targetRowCount = Math.max(targetRowCount,initialRows); // don't trim off real rows otherwise delete breaks&lt;br /&gt;  if (totalRows &gt; targetRowCount) {&lt;br /&gt;   // if there too many blank rows remove the extra rows&lt;br /&gt;   rows.slice(targetRowCount).remove(); // negative to strip from ends&lt;br /&gt;  } else if (totalRows &amp;lt; targetRowCount) {&lt;br /&gt;   // add new blank rows to bring the total up to the desired number&lt;br /&gt;   for (var newRowIndex = totalRows; newRowIndex &amp;lt; targetRowCount; newRowIndex++) {&lt;br /&gt;    addRow(newRowIndex);&lt;br /&gt;   }&lt;br /&gt;  } else {&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;  // update the hidden form with the new form count&lt;br /&gt;  $('#id_invoiceitem_set-TOTAL_FORMS').val(targetRowCount);&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function countBlankRows(rows) {&lt;br /&gt;  // count the empty rows from the bottom up, stopping at the first non-blank row&lt;br /&gt;  var blankRows = 0;&lt;br /&gt;  for (var i = rows.length -1; i&gt;=0; i--) {&lt;br /&gt;   if (isEmptyRow(rows[i])) {&lt;br /&gt;    blankRows++;&lt;br /&gt;   } else {&lt;br /&gt;    break;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return blankRows;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function isEmptyRow(row) {&lt;br /&gt;  // loop through all the inputs in the row, return true if they are all blank&lt;br /&gt;  // whitespace is ignored&lt;br /&gt;  var inputs = $(row).find(':input').filter(':not(:hidden)');&lt;br /&gt;  for (var j = 0; j &amp;lt; inputs.length; j++) {&lt;br /&gt;   if ($.trim(inputs[j].value).length) {&lt;br /&gt;    return false;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  return true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; function addRow(newRowIndex) {&lt;br /&gt;  var newRow = $('#templateItemRow').clone(true);&lt;br /&gt;  newRow.addClass('invoiceItemRow');&lt;br /&gt;  newRow.removeAttr('id'); //prevent duplicated template row id&lt;br /&gt;  newRow.show();&lt;br /&gt;  // replace placeholder with row index&lt;br /&gt;  newRow.find(':input').each(function() {&lt;br /&gt;   $(this).attr("name", $(this).attr("name").replace('__prefix__', newRowIndex));&lt;br /&gt;   $(this).attr("id", $(this).attr("id").replace('__prefix__', newRowIndex));&lt;br /&gt;  });&lt;br /&gt;  $('.invoiceItemRow:last').after(newRow);&lt;br /&gt; }&lt;br /&gt;&amp;lt;/script&gt;&lt;br /&gt;...&lt;br /&gt;{{ itemFormSet.management_form }}&lt;br /&gt;&amp;lt;tr id="templateItemRow" class="invoiceItemRow" style="display: none;"&gt;&lt;br /&gt; &amp;lt;td&gt;&amp;lt;strong&gt;Item:&amp;lt;/strong&gt;&amp;lt;/td&gt;&lt;br /&gt; &amp;lt;td&gt;&lt;br /&gt;  {{ itemFormSet.empty_form.id }}&lt;br /&gt;  {{ itemFormSet.empty_form.description }}&lt;br /&gt;  {{ itemFormSet.empty_form.description.errors }}&amp;lt;/td&gt;&lt;br /&gt; &amp;lt;td class="price"&gt;£{{ itemFormSet.empty_form.price }} {{ itemFormSet.empty_form.price.errors }}&amp;lt;/td&gt;&amp;lt;/tr&gt;&lt;br /&gt;{% for item in itemFormSet.forms %}&lt;br /&gt;&amp;lt;tr class="invoiceItemRow"&gt;&lt;br /&gt; &amp;lt;td&gt;&amp;lt;strong&gt;Item:&amp;lt;/strong&gt;&amp;lt;/td&gt;&lt;br /&gt; &amp;lt;td&gt;&lt;br /&gt;  {{ item.id }}&lt;br /&gt;  {{ item.description }}&lt;br /&gt;  {{ item.description.errors }}&amp;lt;/td&gt;&lt;br /&gt; &amp;lt;td class="price"&gt;£{{ item.price }} {{ item.price.errors }}&amp;lt;/td&gt;&amp;lt;/tr&gt;&lt;br /&gt;{% endfor %}&lt;br /&gt;...&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The result is a form that intuitively shrinks/grows as the content is added/removed.&lt;br /&gt;&lt;br /&gt;The javascript is of course actually in a separate .js file.&lt;br /&gt;&lt;br /&gt;References:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://docs.djangoproject.com/en/dev/topics/forms/formsets/"&gt;https://docs.djangoproject.com/en/dev/topics/forms/formsets/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://api.jquery.com/"&gt;http://api.jquery.com/&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Footnote. You may have noticed the delete-if-empty customisation which I like for usability. References for this at&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://pastebin.com/f40a3bde9"&gt;http://pastebin.com/f40a3bde9&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/django-users/browse_thread/thread/9e26cf3ab1d1fcb1?tvc=2"&gt;http://groups.google.com/group/django-users/browse_thread/thread/9e26cf3ab1d1fcb1?tvc=2&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://groups.google.com/group/django-users/browse_thread/thread/23539f5e085e62b0"&gt;http://groups.google.com/group/django-users/browse_thread/thread/23539f5e085e62b0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1390054549969590161?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1390054549969590161/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1390054549969590161' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1390054549969590161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1390054549969590161'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/07/auto-expanding-django-formset-with.html' title='Auto-expanding django formset with jQuery'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7979159669115124674</id><published>2011-05-23T09:38:00.004Z</published><updated>2011-05-23T22:39:49.668Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='csv'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='c#'/><category scheme='http://www.blogger.com/atom/ns#' term='NUnit'/><title type='text'>Data driven test in NUnit with csv source data</title><content type='html'>I wanted to test a date parser across a large range of values so wanted a simple test harness to test all the values.&lt;br /&gt;&lt;br /&gt;The test framework options around c# / .net seem to be:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;MSTest - can do csv via jet, but can't to inline test data which is something I also want.&lt;/li&gt;&lt;li&gt;NUnit - can do inline data driven test data (with the TestCase(data...) attribute), and has support for extending this via the TestCaseSource attribute.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xUnit - confusing (aka flexible), doesn't seem to get me to my end result any faster after a bit of searching around.&lt;/li&gt;&lt;/ul&gt;I've used NUnit and combined TestCaseSource with a simple wrapper class around the csv parsing library&lt;br /&gt;&lt;br /&gt;To get this to work:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Save your csv file in your test project&lt;/li&gt;&lt;li&gt;add the file to your project (in visual studio 2008 in this case)&lt;/li&gt;&lt;li&gt;right-click on the csv file in solution explorer, click properties, change "&lt;span style="font-style: italic;"&gt;Copy to Output Directory&lt;/span&gt;" to "&lt;span style="font-style: italic;"&gt;Copy Always&lt;/span&gt;"&lt;/li&gt;&lt;li&gt;download the &lt;a href="http://www.codeproject.com/KB/database/CsvReader/CsvReader_bin.zip"&gt;binaries (dlls) for csv reader&lt;/a&gt; from code project, add a reference to this in your test project&lt;/li&gt;&lt;li&gt;add a private method to your test class for reading the csv file and returning an enumarable (see code below)&lt;/li&gt;&lt;li&gt;add the TestCaseSource attribute to your test method(s) that you want to use the csv data, referencing your new IEnumerable method (see code below)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;using System.Collections.Generic;&lt;br /&gt;using System.IO;&lt;br /&gt;using LumenWorks.Framework.IO.Csv;&lt;br /&gt;using NUnit.Framework;&lt;br /&gt;&lt;br /&gt;namespace mytests&lt;br /&gt;{&lt;br /&gt;    class MegaTests&lt;br /&gt;    {&lt;br /&gt;        [Test, TestCaseSource("GetTestData")]&lt;br /&gt;        public void MyExample_Test(int data1, int data2, int expectedOutput)&lt;br /&gt;        {&lt;br /&gt;            var methodOutput = MethodUnderTest(data2, data1);&lt;br /&gt;            Assert.AreEqual(expectedOutput, methodOutput, string.Format("Method failed for data1: {0}, data2: {1}", data1, data2));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private int MethodUnderTest(int data2, int data1)&lt;br /&gt;        {&lt;br /&gt;            return 42; //todo: real implementation&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        private IEnumerable&amp;lt;int[]&amp;gt; GetTestData()&lt;br /&gt;        {&lt;br /&gt;            using (var csv = new CsvReader(new StreamReader("test-data.csv"), true))&lt;br /&gt;            {&lt;br /&gt;                while (csv.ReadNextRecord())&lt;br /&gt;                {&lt;br /&gt;                    int data1 = int.Parse(csv[0]);&lt;br /&gt;                    int data2 = int.Parse(csv[1]);&lt;br /&gt;                    int expectedOutput = int.Parse(csv[2]);&lt;br /&gt;                    yield return new[] { data1, data2, expectedOutput };&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;references:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeproject.com/KB/database/CsvReader.aspx"&gt;CodeProject.com - CsvReader&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/4036840/data-driven-testing-in-nunit"&gt;StackOverflow.com - Data-driven testing in NUnit&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nunit.com/index.php?p=testCaseSource&amp;amp;r=2.5.8"&gt;NUnit TestCaseSource&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/9k7k7cf0%28v=vs.80%29.aspx"&gt;msdn ref, c# yield&lt;/a&gt; - for generating an IEnumerable.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7979159669115124674?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7979159669115124674/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7979159669115124674' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7979159669115124674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7979159669115124674'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/05/data-driven-test-in-nunit-with-csv.html' title='Data driven test in NUnit with csv source data'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7525465672135952518</id><published>2011-05-18T22:30:00.004Z</published><updated>2011-05-18T23:24:56.428Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='dhtml'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='html'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>Reliable javascript checkbox events</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/tim_abell/5734606641/"&gt;&lt;img style="float: left; margin: 0pt 10px 10px 0pt; cursor: pointer; width: 135px; height: 240px;" src="http://farm4.static.flickr.com/3652/5734606641_c61a818d47_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Some sites have checkboxes which show/hide another element when you click them. This a handy feature, but not all sites take into account the fact that firefox remembers the contents of a form when you reload the page (this is a good thing).&lt;br /&gt;&lt;br /&gt;So here's how you avoid that with jQuery:&lt;br /&gt;&lt;br /&gt;&lt;pre style="clear:both;"&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&gt;&lt;br /&gt;    $(function() {&lt;br /&gt;        // initialise show/hide to match the checkbox value&lt;br /&gt;        $('.targetelements').toggle($('#mycheckbox').attr('checked'));&lt;br /&gt;        // attach click handler for show/hide to checkbox&lt;br /&gt;        $('#mycheckbox').click(function(){ $('.targetelements').toggle(this.checked);})&lt;br /&gt;    });&lt;br /&gt;&amp;lt;/script&gt;   &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Simples!&lt;br /&gt;&lt;br /&gt;You could use the same principle without jQuery if you need to. Simply read the value of the checkbox with javascript the old fashioned way before deciding whether to hide when you initialise you page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7525465672135952518?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7525465672135952518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7525465672135952518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7525465672135952518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7525465672135952518'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2011/05/reliable-javascript-checkbox-events.html' title='Reliable javascript checkbox events'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3652/5734606641_c61a818d47_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-589107923468491077</id><published>2010-12-15T10:35:00.003Z</published><updated>2010-12-15T10:39:50.788Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='pidgin'/><title type='text'>Using Pidgin for IRC</title><content type='html'>&lt;a href="http://pidgin.im/" class="external text" title="http://pidgin.im/" rel="nofollow"&gt;pidgin&lt;/a&gt; is quite a good irc client.&lt;p&gt;Once you have downloaded and installed pidgin: &lt;/p&gt; &lt;ul&gt;&lt;li&gt; Accounts &gt; Manage Accounts &lt;/li&gt;&lt;li&gt; Add... &lt;/li&gt;&lt;li&gt; Protocol: IRC &lt;/li&gt;&lt;li&gt; Username: your preferred nickname (please use your real name) &lt;/li&gt;&lt;li&gt; Server: your irc server, eg irc.freenode.org &lt;/li&gt;&lt;li&gt; Password - leave blank &lt;/li&gt;&lt;li&gt; Add &lt;/li&gt;&lt;li&gt; Close (the "Accounts" window) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Back in the main pidgin window: &lt;/p&gt; &lt;ul&gt;&lt;li&gt; Buddies &gt; Join A Chat... &lt;/li&gt;&lt;li&gt; Account: the one you just created &lt;/li&gt;&lt;li&gt; Channel: #favouriteroom,   eg #pidgin&lt;br /&gt;&lt;/li&gt;&lt;li&gt; Password - leave blank &lt;/li&gt;&lt;li&gt; Join &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;In the new chat window for the chatroom: &lt;/p&gt; &lt;ul&gt;&lt;li&gt; Conversation &gt; Add... &lt;/li&gt;&lt;li&gt; Tick "Autojoin when account connects." &lt;/li&gt;&lt;li&gt; Tick "Remain in chat after window is closed." &lt;/li&gt;&lt;li&gt; Leave everything else as defaults &lt;/li&gt;&lt;li&gt; Add &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;Now when pidgin launches you will have "#favouriteroom" in your buddy list, and you can double click to open the chatroom. &lt;/p&gt;&lt;p&gt;You may also want to make pidgin start when windows starts; &lt;/p&gt;&lt;p&gt;From the main window: &lt;/p&gt; &lt;ul&gt;&lt;li&gt; Tools &gt; Plugins &lt;/li&gt;&lt;li&gt; Tick "Windows Pidgin Options" &lt;/li&gt;&lt;li&gt; Configure Plugin &lt;/li&gt;&lt;li&gt; Tick "Start Pidgin on Windows startup" &lt;/li&gt;&lt;li&gt; Close &lt;/li&gt;&lt;li&gt; Close (plugin window) &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;I also recommend enabling the Markerline plugin to help see what is new in the channel. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-589107923468491077?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/589107923468491077/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=589107923468491077' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/589107923468491077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/589107923468491077'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2010/12/using-pidgin-for-irc.html' title='Using Pidgin for IRC'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-362080553431078830</id><published>2010-09-03T08:31:00.004Z</published><updated>2011-01-14T11:56:40.103Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='kdiff3'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>configuring kdiff3 as a mergetool in msysgit</title><content type='html'>How to configure kdiff3 as a mergetool in msysgit. (I think if you install kdiff3 *before* msysgit it is picked up automatically, if not, do the following after installing both).&lt;br /&gt;&lt;br /&gt;In git bash:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git config --global merge.tool kdiff3&lt;br /&gt;git config --global mergetool.kdiff3.path "c:\Program Files\KDiff3\kdiff3.exe"&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;double check:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cat ~/.gitconfig&lt;br /&gt;[merge]&lt;br /&gt;  tool = kdiff3&lt;br /&gt;[mergetool "kdiff3"]&lt;br /&gt;  path = c:\\Program Files\\KDiff3\\kdiff3.exe&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;refs:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://markmail.org/message/dvrnn7ilprvinrfp#query:msysgit%20kdiff3%20.gitconfig+page:1+mid:dvrnn7ilprvinrfp+state:results"&gt;http://markmail.org/message/dvrnn7ilprvinrfp#query:msysgit%20kdiff3%20.gitconfig+page:1+mid:dvrnn7ilprvinrfp+state:results&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-config.html"&gt;http://www.kernel.org/pub/software/scm/git/docs/git-config.html&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Under cygwin, the setup would be:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;git config --global merge.tool kdiff3&lt;br /&gt;git config --global mergetool.kdiff3.path /cygdrive/c/Program\ Files\ \(x86\)/KDiff3/kdiff3.exe&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Giving the config file contents:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;[merge]&lt;br /&gt;        tool = kdiff3&lt;br /&gt;[mergetool "kdiff3"]&lt;br /&gt;        path = /cygdrive/c/Program Files (x86)/KDiff3/kdiff3.exe&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Which by the way you can view with&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;git config -e --global&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-362080553431078830?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/362080553431078830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=362080553431078830' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/362080553431078830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/362080553431078830'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2010/09/configuring-kdiff3-as-mergetool-in.html' title='configuring kdiff3 as a mergetool in msysgit'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1272986229621647717</id><published>2010-02-04T14:01:00.014Z</published><updated>2011-05-18T22:12:01.236Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='openlayers'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>openlayers svn into git</title><content type='html'>Initial clone:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git svn clone -T trunk/openlayers/ -t tags/openlayers/ -b branches/openlayers/ http://svn.openlayers.org/ openlayers.git&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;"http://svn.openlayers.org/tags/openlayers/docs-2.8/" is in the wrong place and gets pulled in by the git clone.&lt;br /&gt;&lt;br /&gt;I should have used &lt;code&gt;--no-follow-parent&lt;/code&gt; to avoid the &lt;em&gt;docs-2.8&lt;/em&gt; tag pulling in docs history but not going to re-clone now. If you are repeating this, try this instead:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git svn clone --no-follow-parent -T trunk/openlayers/ -t tags/openlayers/ -b branches/openlayers/ http://svn.openlayers.org/ openlayers.git&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Find the errant docs branches &amp; eliminate:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;cd openlayers.git&lt;br /&gt;for x in `git for-each-ref --format="%(refname)" 'refs/remotes/tags/docs*'`; do git update-ref -d $x; done&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;# &lt;a href="http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/"&gt;http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/&lt;/a&gt;&lt;br /&gt;# expunge old objects (I think this works)&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git reflog expire --all&lt;br /&gt;git gc --aggressive --prune&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Then run: &lt;a href="http://www.shatow.net/fix-svn-refs.sh"&gt;http://www.shatow.net/fix-svn-refs.sh&lt;/a&gt; to create real git tags.&lt;br /&gt;&lt;br /&gt;If you just want the result you can download a copy complete with svn metadata from &lt;a href="http://www.timwise.co.uk/openlayers-dev/openlayers.git.tgz"&gt;http://www.timwise.co.uk/openlayers-dev/openlayers.git.tgz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You will then be able to run &lt;br /&gt;&lt;pre&gt;&lt;code&gt;git svn fetch&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;to get updates from the openlayers svn server.&lt;br /&gt;&lt;br /&gt;There is a published copy at &lt;a href="http://github.com/timabell/openlayers"&gt;http://github.com/timabell/openlayers&lt;/a&gt;, though it doesn't have the svn metadata.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;I also tackled the docs folder:&lt;br /&gt;&lt;br /&gt;The docs directory has no matching branch or tag directories, so the following is sufficient:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;git svn clone -T trunk/doc http://svn.openlayers.org/ openlayers-doc.git&lt;br /&gt;git gc --aggressive --prune&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;You can download this from &lt;a href="http://www.timwise.co.uk/openlayers-dev/openlayers-doc.git.tgz"&gt;http://www.timwise.co.uk/openlayers-dev/openlayers-doc.git.tgz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;Anything else I come up with will end up at &lt;a href="http://www.timwise.co.uk/openlayers-dev/"&gt;http://www.timwise.co.uk/openlayers-dev/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1272986229621647717?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1272986229621647717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1272986229621647717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1272986229621647717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1272986229621647717'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2010/02/openlayers-svn-into-git.html' title='openlayers svn into git'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7478677393110232279</id><published>2009-12-18T10:08:00.002Z</published><updated>2009-12-18T11:57:06.028Z</updated><title type='text'>backing up Vista</title><content type='html'>So here's a tale of annoying things.&lt;br /&gt;&lt;br /&gt;I generally try and avoid running anything proprietary at home, and especially anything from Microsoft. But for reasons beyond my control a copy of Vista has embedded itself in our household.&lt;br /&gt;&lt;br /&gt;For my linux backups I've settled on &lt;a href="http://dar.linux.free.fr/"&gt;dar&lt;/a&gt; (Disk ARchiver) + &lt;a href="http://dargui.sourceforge.net/"&gt;dargui&lt;/a&gt; as it applies the keep it simple rule (certainly in comparison with a lot of other tools I tried, such as the ubuntu default "home user backup" tool, which has a simple ui but offers limited control and I'm not sure how easily I could recover files from it in a disaster). Dar is like tar (Tape ARchiver) but more designed with backup to disk in mind, which is what I was after in order to backup to &lt;a href="http://www.ebuyer.com/product/178934"&gt;usb hdd&lt;/a&gt;, and most importantly does incremental/differential backups the way I want.&lt;br /&gt;&lt;br /&gt;So then I came to back up this Vista home directory (sorry, Users directory / profiles). I have disliked the old fashioned microsoft backup files (.bkf) from Windows XP and before ever since I tried to get files out of one from a Linux box. Turns out it's not exactly the best supported format. I didn't have much luck with &lt;a href="http://freshmeat.net/projects/mtftar/"&gt;mtftar&lt;/a&gt;. It seems Microsoft have produced a replacement (&lt;a href="http://en.wiktionary.org/wiki/plus_%C3%A7a_change,_plus_c%27est_la_m%C3%AAme_chose"&gt;plus &amp;ccedil;a change&lt;/a&gt;) to the old windows backup that is evidently designed to be &lt;a href="http://dictionary.reference.com/browse/simple" title="lacking mental acuteness or sense"&gt;simple&lt;/a&gt;, which has very strange ideas about how you might want to back up your pc. It seems keener to back up the sample image files from the office install than than the user's photos. I very quickly fell out with this tool and moved on.&lt;br /&gt;&lt;br /&gt;Some people might recommend windows home server, but I am not about to &lt;em&gt;pay&lt;/em&gt; for more shoddy Microsoft software in order to solve problems created by other shoddy Microsoft software. Vote with your wallet, as they say.&lt;br /&gt;&lt;br /&gt;So next on the list, remote backup from a linux box. &lt;a href="http://backuppc.sourceforge.net/"&gt;backup pc&lt;/a&gt; looked great, and has many nifty features, however having got it all set up I got permissions errors in the My Documents etc folders, which are the important ones. I tried different user permissions for the backup user, and different group memberships, though stopped short of resetting all user directory permissions so as to not break anything but couldn't get past these errors. More details on that attempt in my &lt;a href="http://timwise.blogspot.com/2009/10/backuppc-and-windows-vista.html"&gt;backuppc and windows vista&lt;/a&gt; blog entry. There is a hint in the &lt;a href="http://en.wikipedia.org/wiki/Robocopy"&gt;Robocopy wikipedia&lt;/a&gt; that there is some special mode needed to be able to get past these permissions issues. &lt;blockquote cite="http://en.wikipedia.org/wiki/Robocopy"&gt;"The so-called Backup mode is an administrative privilege that allows Robocopy to override permissions settings (specifically, NTFS ACLs) for the purpose of making backups."&lt;/blockquote&gt;But I didn't get any further than that.&lt;br /&gt;&lt;br /&gt;So finally I come to the conclusion that Vista just doesn't want you to do backups without paying microsoft more money, and that they have forgotten or never knew the &lt;a href="http://en.wikipedia.org/wiki/KISS_principle"&gt;KISS&lt;/a&gt; mantra that makes *nix such a pleasure to work with. (Rather opting for their usual "making simple things easy and difficult things impossible".)&lt;br /&gt;&lt;br /&gt;It was &lt;a href="http://www.linuxformat.co.uk/archives?issue=127"&gt;Linux Format 127 Ubuntu 9.10 Cover Disc&lt;/a&gt; that came to the rescue. Popped the disc in,rebooted, connected my usb hdd (formatted with ext3 of course), ran &lt;code&gt;apt-get install dar&lt;/code&gt;, opened the disk icon on the desktop representing the evil vista installation partition on the local disk (to get it mounted), opened the usb hdd disk icon (also to get it mounted), then ran &lt;code&gt;dar -c /media/usbhdd/backups/vistargh -z&lt;/code&gt; from the directory /media/vista/Users/. This ran fine and I was able to read the file from a better operating system with no issues.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7478677393110232279?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7478677393110232279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7478677393110232279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7478677393110232279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7478677393110232279'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/12/backing-up-vista.html' title='backing up Vista'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2991052489429405502</id><published>2009-12-18T09:59:00.005Z</published><updated>2009-12-18T10:06:50.213Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mcts'/><category scheme='http://www.blogger.com/atom/ns#' term='certification'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>MCTS in ASP.NET 3.5 - Mission accomplished.</title><content type='html'>&lt;div style="background-color: white;padding:1em;"&gt;&lt;img style="margin: 0px auto 0; display: block; text-align: center; width: 361px; height: 80px;" src="http://www.timwise.co.uk/images/blog/MCTS-ASP.NET-3.5.png" alt="Microsoft Certified Technology Specialist" border="0" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;I am now a &lt;span style="font-style: italic;"&gt;Microsoft Certified Technology Specialist in .NET Framework 3.5, ASP.NET Applications&lt;/span&gt;, which is nice.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2991052489429405502?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2991052489429405502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2991052489429405502' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2991052489429405502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2991052489429405502'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/12/mcts-in-aspnet-35-mission-accomplished.html' title='MCTS in ASP.NET 3.5 - Mission accomplished.'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-8826812947380288670</id><published>2009-11-16T17:22:00.005Z</published><updated>2009-11-17T10:23:25.092Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='irc'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='sys admin'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>getting supybot to announce new bugzilla bugs</title><content type='html'>getting supybot to announce new bugzilla bugs - I've just put here the key non-obvious things that tripped me up when trying to set this up.&lt;br /&gt;&lt;br /&gt;All done on Ubuntu 8.04.3 LTS&lt;br /&gt;&lt;br /&gt;Install &lt;a href="http://sourceforge.net/projects/supybot/"&gt;supybot&lt;/a&gt; and the &lt;a href="http://code.google.com/p/supybot-bugzilla/"&gt;supybot bugzilla plugin&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Create a system group (supybot) and user (bugbot) to run supybot as.&lt;br /&gt;&lt;br /&gt;Set up your supybot configuration file as desired.&lt;br /&gt;&lt;br /&gt;Getting supybot to start at startup:&lt;br /&gt;&lt;a href="http://www.schwer.us/journal/2005/04/17/supybot-init-script-for-debian/"&gt;http://www.schwer.us/journal/2005/04/17/supybot-init-script-for-debian/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's my modified init script&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ cat /etc/init.d/bugbot&lt;br /&gt;#! /bin/sh&lt;br /&gt;#&lt;br /&gt;# supybot init script&lt;br /&gt;# http://www.schwer.us/journal/2005/04/17/supybot-init-script-for-debian/&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;PATH=/sbin:/bin:/usr/sbin:/usr/bin&lt;br /&gt;DAEMON=/usr/bin/supybot&lt;br /&gt;NAME=supybot&lt;br /&gt;DESC=supybot&lt;br /&gt;&lt;br /&gt;test -f $DAEMON || exit 0&lt;br /&gt;&lt;br /&gt;set -e&lt;br /&gt;&lt;br /&gt;case "$1" in&lt;br /&gt;start)&lt;br /&gt;echo -n "Starting $DESC: "&lt;br /&gt;start-stop-daemon --start --quiet \&lt;br /&gt;--chuid bugbot --exec $DAEMON -- --daemon /etc/supybot/bugbot.conf&lt;br /&gt;echo "$NAME."&lt;br /&gt;;;&lt;br /&gt;stop)&lt;br /&gt;echo -n "Stopping $DESC: "&lt;br /&gt;start-stop-daemon --stop --quiet \&lt;br /&gt;--oknodo --exec /usr/bin/python&lt;br /&gt;echo "$NAME."&lt;br /&gt;;;&lt;br /&gt;restart)&lt;br /&gt;$0 stop&lt;br /&gt;$0 start&lt;br /&gt;;;&lt;br /&gt;*)&lt;br /&gt;echo "Usage: $0 {start|stop|restart}" &amp;gt;&amp;2&lt;br /&gt;exit 1&lt;br /&gt;;;&lt;br /&gt;esac&lt;br /&gt;&lt;br /&gt;exit 0&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Set up bugzilla to send a copy of all bugmail to a local address (eg bugbot@localhost), and configure exim4 to accept local mail (as well as smart host delivery), using the mbox format.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;sudo dpkg-reconfigure exim4-config&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Start a conversation with bugbot, get it to identify you, then set the required configuration by sending it messages (you can also set these in the supybot .conf file for your bot):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;config plugins.Bugzilla.mbox /var/mail/bugbot&lt;/li&gt;&lt;br /&gt;&lt;li&gt;config plugins.Bugzilla.bugzillas.your-bugzilla-name.watchedItems.all True&lt;br /&gt;which will turn on the announcements (i had to read the code to find that one!)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Note that supybot doesn't immediately write config changes to disc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-8826812947380288670?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/8826812947380288670/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=8826812947380288670' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8826812947380288670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8826812947380288670'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/11/getting-supybot-to-announce-new.html' title='getting supybot to announce new bugzilla bugs'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1315274421552207269</id><published>2009-11-08T18:12:00.006Z</published><updated>2009-11-10T22:28:00.731Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='bugzilla'/><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='sys admin'/><title type='text'>bugzilla upgrades and user tokens</title><content type='html'>It's bugzilla upgrade time for my private install, and I have for the second time run into a strange issue with the tokens system. Since this is the second time and I know how to fix it, here it is for the record.&lt;br /&gt;&lt;br /&gt;I have upgrade from v3.0.4 to 3.4.3.&lt;br /&gt;&lt;br /&gt;Once the site was up again, saving the site parameters (editparams.cgi) showed a big red warning:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div id="bugzilla-body"&gt;    &lt;div class="throw_error"&gt;     It looks like you didn't come from the right page (you have no valid token for     the &lt;em&gt;edit_parameters&lt;/em&gt; action while processing the     'editparams.cgi' script). The reason could be one of:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You clicked the "Back" button of your web browser after having successfully       submitted changes, which is generally not a good idea (but harmless).&lt;/li&gt;&lt;li&gt;You entered the URL in the address bar of your web browser directly,       which should be safe.&lt;/li&gt;&lt;li&gt;You clicked on a URL which redirected you here &lt;b&gt;without your consent&lt;/b&gt;,       in which case this action is much more critical.&lt;/li&gt;&lt;/ul&gt;     Are you sure you want to commit these changes anyway? This may result in     unexpected and undesired results.&lt;br /&gt;&lt;br /&gt;[Confirm Changes]&lt;br /&gt;&lt;/div&gt;  &lt;p&gt;Or throw away these changes and go back to editparams.cgi.&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;Pushing the button doesn't work (same page shows again).&lt;br /&gt;&lt;br /&gt;After much digging last time I discovered that the tokens it refers to are stored in table bugs.tokens, and that the size of the field is wrong in my installation after the upgrade (again).&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; use bugs;&lt;br /&gt;mysql&gt; describe tokens;&lt;br /&gt;+-----------+--------------+------+-----+---------+-------+&lt;br /&gt;| Field     | Type         | Null | Key | Default | Extra |&lt;br /&gt;+-----------+--------------+------+-----+---------+-------+&lt;br /&gt;| userid    | mediumint(9) | YES  | MUL | NULL    |       |&lt;br /&gt;| issuedate | datetime     | NO   |     | NULL    |       |&lt;br /&gt;| &lt;span style="font-weight: bold;"&gt;token     | varchar(5)&lt;/span&gt;   | NO   | PRI | NULL    |       |&lt;br /&gt;| tokentype | varchar(8)   | YES  |     | NULL    |       |&lt;br /&gt;| eventdata | tinytext     | YES  |     | NULL    |       |&lt;br /&gt;+-----------+--------------+------+-----+---------+-------+&lt;br /&gt;5 rows in set (0.02 sec)&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;According to the published schema, token should be varchar(16). &lt;a href="http://www.ravenbrook.com/project/p4dti/tool/cgi/bugzilla-schema/index.cgi?action=single&amp;amp;version=3.4.2&amp;amp;view=View+schema#table-tokens"&gt;http://www.ravenbrook.com/project/p4dti/tool/cgi/bugzilla-schema/index.cgi?action=single&amp;amp;version=3.4.2&amp;amp;view=View+schema#table-tokens&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To fix the problem I modified the data type as follows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;mysql&gt; alter table tokens modify column token varchar(16) not null;&lt;br /&gt;Query OK, 20 rows affected (0.32 sec)&lt;br /&gt;Records: 20  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;And then I was able to change my parameters.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=527780"&gt;https://bugzilla.mozilla.org/show_bug.cgi?id=527780&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1315274421552207269?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1315274421552207269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1315274421552207269' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1315274421552207269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1315274421552207269'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/11/bugzilla-upgrades-and-user-tokens.html' title='bugzilla upgrades and user tokens'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1907659655312082372</id><published>2009-10-24T22:29:00.002Z</published><updated>2009-10-24T22:39:35.500Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='journal'/><category scheme='http://www.blogger.com/atom/ns#' term='learning'/><category scheme='http://www.blogger.com/atom/ns#' term='books'/><title type='text'>life update - software learning</title><content type='html'>I'm currently reading &lt;a href="http://www.amazon.co.uk/Journey-Software-Professional-Sociology-Programming/dp/0132366134"&gt;Journey of the Software Professional: Sociology of Computer Programming&lt;/a&gt;. It's proved so far to be a unique insight into how developers go from seeing a problem to providing a solution, good or bad. It's quite hard going as there's a lot of detailed analysis into how we work, but it's certainly given me food for thought.&lt;br /&gt;&lt;br /&gt;In another area of self improvement, I recently passed &lt;a href="http://www.microsoft.com/learning/en/us/Exam.aspx?ID=70-536&amp;amp;Locale=en-us"&gt;70-536: TS: Microsoft .NET Framework - Application Development Foundation&lt;/a&gt;, and am currently reading up on the ASP.NET exam with a view to gaining the MCTS cert. Much as I had hoped I'd left exams behind years ago, it is proving to be a useful exercise in filling in the gaps in my knowledge. Today I finally got around to creating something with Web Parts, which I wouldn't otherwise have done, another plan filed away in my cognitive library (cf. Journey of the Software Professional).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1907659655312082372?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1907659655312082372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1907659655312082372' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1907659655312082372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1907659655312082372'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/10/life-update-software-learning.html' title='life update - software learning'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1285384210635406754</id><published>2009-10-23T01:51:00.005Z</published><updated>2009-10-24T22:29:34.727Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='wip'/><category scheme='http://www.blogger.com/atom/ns#' term='vista'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>backuppc and windows vista</title><content type='html'>Steps I took to get a &lt;a href="http://backuppc.sourceforge.net/"&gt;backuppc&lt;/a&gt; server on an ubuntu 8.10 pc in order to be able to back up a windows vista business pc. I've only documented the non-obvious and undocumented items here.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Added a user called backup to the vista pc.&lt;/li&gt;&lt;li&gt;Added the backup user to the "administrators" group. I tried the "backup operators" group but it didn't give access to the user profiles. It looks like robocopy has some black magic that allows it to bypass ACLs when a member of backup operators.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Enabled admin shares (ie \\machine\C$) by adding DWORD registry key "LocalAccountTokenFilterPolicy" to HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System and setting the value to 1. See &lt;a href="http://www.paulspoerry.com/2007/05/09/how-to-access-administrative-shares-on-vista-c/"&gt;How to access Administrative Shares on Vista (C$)&lt;/a&gt; by PaulSpoerry&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Removed the "-N" from the SmbClientFullCmd etc options in backuppc's transfer (xfer) settings as it didn't seem to be using the provided password. Troubleshooting was aided by running "/usr/share/backuppc/bin/BackupPC_dump -v -f vistamachine" directly as user backuppc.&lt;/li&gt;&lt;li&gt;&lt;a href="http://forums.techarena.in/vista-administration/689162.htm#post2788050"&gt;Hide the backup user&lt;/a&gt; from the welcome screen by adding DWORD HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\SpecialAccounts\UserList\backup with value 0 to the registry. "backup" is the name of the user to hide, 0 means hide, 1 means show.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;enjoy.&lt;br /&gt;&lt;br /&gt;See also:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="https://help.ubuntu.com/community/BackupPC/smb"&gt;ubuntu backuppc/vista guide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Current status: This has only been partially successful so far. The backup runs but has lots of files missing due access denied errors on many of the important folders. It looks like I will have to manually give "backup operators" permissions to these folders. Sigh. Vista is proving to be less than easy for me to support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1285384210635406754?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1285384210635406754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1285384210635406754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1285384210635406754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1285384210635406754'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/10/backuppc-and-windows-vista.html' title='backuppc and windows vista'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-4394747768931877446</id><published>2009-04-11T22:04:00.001Z</published><updated>2009-04-11T22:04:53.372Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><title type='text'>git-svn imports for open source projects</title><content type='html'>I've just written a lengthy &lt;a href="https://lists.gnucash.org/pipermail/gnucash-devel/2009-April/025196.html"&gt;open letter to github&lt;/a&gt; in the hope that they will support continuous centralized imports from svn to git.&lt;br /&gt;&lt;br /&gt;If they don't wish to rise to the challenge (and I wouldn't hold it against them), I am wondering if it would be viable to run a server on fasthosts or something funded by donations that would do nothing but continuously import from svn servers, and push the result to github.&lt;br /&gt;&lt;br /&gt;That's all for now.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-4394747768931877446?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/4394747768931877446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=4394747768931877446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4394747768931877446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4394747768931877446'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/04/git-svn-imports-for-open-source.html' title='git-svn imports for open source projects'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-8997739866191843988</id><published>2009-04-11T16:26:00.001Z</published><updated>2009-04-11T16:26:32.840Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><title type='text'>mini police eye in the sky</title><content type='html'>Just a quick note on an idea that's been bothering me.&lt;br /&gt;&lt;br /&gt;How about a mini semi autonomous police surveillance helicopter?&lt;br /&gt;&lt;br /&gt;Would cheaper than a real helicopter, but still offers many of the advantages of having an eye in the sky that can go direct to the scene without contending with traffic etc.&lt;br /&gt;&lt;br /&gt;Something like a electric model helicopter with 2+ blades for stability, with a petrol generator for longer run times.&lt;br /&gt;&lt;br /&gt;Electronics and gyros to make it naturally stable, and a gps &amp;amp; altimeter for auto navigation.&lt;br /&gt;&lt;br /&gt;Carrying a payload of normal and infrared cameras for information gathering.&lt;br /&gt;&lt;br /&gt;Transmitting a live video feed over long range radio, and offering long distance control, so it could be controlled centrally by an operator.&lt;br /&gt;&lt;br /&gt;I reckon these could be produced for a few thousand pounds each and provide excellent assistance to the force.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-8997739866191843988?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/8997739866191843988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=8997739866191843988' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8997739866191843988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8997739866191843988'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/04/mini-police-eye-in-sky.html' title='mini police eye in the sky'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-8623933611307349730</id><published>2009-01-29T11:49:00.011Z</published><updated>2009-06-25T11:59:34.737Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='visual studio'/><category scheme='http://www.blogger.com/atom/ns#' term='vb'/><category scheme='http://www.blogger.com/atom/ns#' term='macro'/><title type='text'>format all documents in a visual studio solution</title><content type='html'>Here's a handy macro script for visual studio I knocked together today.&lt;br /&gt;It runs "edit, format document" on every document of the listed file types.&lt;br /&gt;&lt;br /&gt;You have to keep an eye on it as it's interactive and does sometimes pop up a message and wait for an answer.&lt;br /&gt;&lt;br /&gt;You can get the vb file at &lt;a href="http://github.com/timabell/vs-formatter-macro"&gt;http://github.com/timabell/vs-formatter-macro&lt;/a&gt;&lt;br /&gt;More info at &lt;a href="http://wiki.github.com/timabell/vs-formatter-macro"&gt;http://wiki.github.com/timabell/vs-formatter-macro&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Below is the original code. Note that this is older than the version available on github above.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Imports System&lt;br /&gt;Imports EnvDTE&lt;br /&gt;Imports EnvDTE80&lt;br /&gt;Imports EnvDTE90&lt;br /&gt;Imports System.Collections.Generic&lt;br /&gt;Imports System.Diagnostics&lt;br /&gt;Imports System.Text&lt;br /&gt;&lt;br /&gt;Public Module Formatting&lt;br /&gt;&lt;br /&gt; Dim allowed As List(Of String) = New List(Of String)&lt;br /&gt; Dim processed As Integer = 0&lt;br /&gt; Dim ignored As Integer = 0&lt;br /&gt; Dim errors As StringBuilder = New StringBuilder()&lt;br /&gt; Dim skippedExtensions As List(Of String) = New List(Of String)&lt;br /&gt;&lt;br /&gt; Public Sub FormatProject()&lt;br /&gt;  allowed.Add(".master")&lt;br /&gt;  allowed.Add(".aspx")&lt;br /&gt;  allowed.Add(".ascx")&lt;br /&gt;  allowed.Add(".asmx")&lt;br /&gt;  allowed.Add(".cs")&lt;br /&gt;  allowed.Add(".vb")&lt;br /&gt;  allowed.Add(".config")&lt;br /&gt;  allowed.Add(".css")&lt;br /&gt;  allowed.Add(".htm")&lt;br /&gt;  allowed.Add(".html")&lt;br /&gt;  allowed.Add(".js")&lt;br /&gt;  Try&lt;br /&gt;   recurseSolution(AddressOf processItem)&lt;br /&gt;  Catch ex As Exception&lt;br /&gt;   Debug.Print("error in main loop: " + ex.ToString())&lt;br /&gt;  End Try&lt;br /&gt;  Debug.Print("processed items: " + processed.ToString())&lt;br /&gt;  Debug.Print("ignored items: " + ignored.ToString())&lt;br /&gt;  Debug.Print("ignored extensions: " + String.Join(" ", skippedExtensions.ToArray()))&lt;br /&gt;  Debug.Print(errors.ToString())&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt; Private Sub processItem(ByVal Item As ProjectItem)&lt;br /&gt;  If Not Item.Name.Contains(".") Then&lt;br /&gt;   'Debug.Print("no file extension. ignoring.")&lt;br /&gt;   ignored += 1&lt;br /&gt;   Return&lt;br /&gt;  End If&lt;br /&gt;  Dim ext As String&lt;br /&gt;  ext = Item.Name.Substring(Item.Name.LastIndexOf(".")) 'get file extension&lt;br /&gt;  If allowed.Contains(ext) Then&lt;br /&gt;   formatItem(Item)&lt;br /&gt;   processed += 1&lt;br /&gt;  Else&lt;br /&gt;   'Debug.Print("ignoring file with extension: " + ext)&lt;br /&gt;   If Not skippedExtensions.Contains(ext) Then&lt;br /&gt;    skippedExtensions.Add(ext)&lt;br /&gt;   End If&lt;br /&gt;   ignored += 1&lt;br /&gt;  End If&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt; Private Sub formatItem(ByVal Item As ProjectItem)&lt;br /&gt;  Debug.Print("processing file " + Item.Name)&lt;br /&gt;  Try&lt;br /&gt;   Dim window As EnvDTE.Window&lt;br /&gt;   window = Item.Open()&lt;br /&gt;   window.Activate()&lt;br /&gt;   DTE.ExecuteCommand("Edit.FormatDocument", "")&lt;br /&gt;   window.Document.Save()&lt;br /&gt;   window.Close()&lt;br /&gt;  Catch ex As Exception&lt;br /&gt;   Debug.Print("error processing file." + ex.ToString())&lt;br /&gt;   errors.Append("error processing file " + Item.Name + "  " + ex.ToString())&lt;br /&gt;  End Try&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt; Private Delegate Sub task(ByVal Item As ProjectItem)&lt;br /&gt;&lt;br /&gt; Private Sub recurseSolution(ByVal taskRoutine As task)&lt;br /&gt;  For Each Proj As Project In DTE.Solution.Projects&lt;br /&gt;   Debug.Print("project " + Proj.Name)&lt;br /&gt;   For Each Item As ProjectItem In Proj.ProjectItems&lt;br /&gt;    recurseItems(Item, 0, taskRoutine)&lt;br /&gt;   Next&lt;br /&gt;  Next&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt; Private Sub recurseItems(ByVal Item As ProjectItem, ByVal depth As Integer, ByVal taskRoutine As task)&lt;br /&gt;  Dim indent As String = New String("-", depth)&lt;br /&gt;  Debug.Print(indent + " " + Item.Name)&lt;br /&gt;  If Not Item.ProjectItems Is Nothing Then&lt;br /&gt;   For Each Child As ProjectItem In Item.ProjectItems&lt;br /&gt;    taskRoutine(Child)&lt;br /&gt;    recurseItems(Child, depth + 1, taskRoutine)&lt;br /&gt;   Next&lt;br /&gt;  End If&lt;br /&gt; End Sub&lt;br /&gt;&lt;br /&gt;End Module&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-8623933611307349730?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/8623933611307349730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=8623933611307349730' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8623933611307349730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8623933611307349730'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2009/01/format-all-document-in-visual-studio.html' title='format all documents in a visual studio solution'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7416804086430204798</id><published>2008-12-18T21:27:00.002Z</published><updated>2009-04-04T00:31:35.019Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>password-free ubuntu login with facebrowser</title><content type='html'>If you trust everyone who has physical access to a pc (if not then you are encrypting your files, right?) then there seems little point in having to type a password just because more than one user uses the pc.&lt;br /&gt;&lt;br /&gt;So here's how to log in from the gdm "face browser" with a single click.&lt;br /&gt;Instructions tested with Ubuntu 8.04 Hardy Heron and 8.10 Intrepid Ibex.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;as root, create a new file containing the usernames of all the users you want be able to log in through gdm without entering a password:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;sudo -i&lt;br /&gt;echo 'username' &amp;gt;&amp;gt; /etc/gdm/nopassusers&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;now still as root modify the pam settings for gdm to check this file and allow this user in based on being in the list:&lt;br /&gt;vi&amp;nbsp; /etc/pam.d/gdm&lt;br /&gt;&lt;code&gt;&lt;br /&gt;vi /etc/pam.d/gdm&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;and modify to contain the new listfile item&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#%PAM-1.0&lt;br /&gt;auth    requisite       pam_nologin.so&lt;br /&gt;auth    required        pam_env.so readenv=1&lt;br /&gt;auth    required        pam_env.so readenv=1 envfile=/etc/default/locale&lt;br /&gt;&lt;strong&gt;auth    sufficient      pam_listfile.so item=user sense=allow file=/etc/gdm/nopassusers onerr=fail&lt;/strong&gt;  #add this line&lt;br /&gt;@include common-auth&lt;br /&gt;auth    optional        pam_gnome_keyring.so&lt;br /&gt;@include common-account&lt;br /&gt;session required        pam_limits.so&lt;br /&gt;@include common-session&lt;br /&gt;session optional        pam_gnome_keyring.so auto_start&lt;br /&gt;@include common-password&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;now simply restart gdm (or the whole machine) and try your new one-click login&lt;br /&gt;&lt;code&gt;&lt;br /&gt;/etc/init.d/gdm restart&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;This means the keyring isn't unlocked, so you may have to type in your password anyway before your wireless connects.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;references:&lt;br /&gt;&lt;a href="http://mirror.hamakor.org.il/archives/linux-il/05-2004/10149.html"&gt;http://mirror.hamakor.org.il/archives/linux-il/05-2004/10149.html&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_listfile.html"&gt;http://www.kernel.org/pub/linux/libs/pam/Linux-PAM-html/sag-pam_listfile.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7416804086430204798?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7416804086430204798/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7416804086430204798' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7416804086430204798'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7416804086430204798'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/12/password-free-ubuntu-login-with.html' title='password-free ubuntu login with facebrowser'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2621355116425651592</id><published>2008-09-10T14:18:00.007Z</published><updated>2008-09-11T09:27:31.215Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='troubleshooting'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>error "Not a valid object name" filtering an ex-svn git repo with renames</title><content type='html'>&lt;div style="float:right;margin:0 0 1em 1em;"&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/2800643267/in/set-72157606969432978/"&gt;&lt;img style="border:none;" src="http://farm4.static.flickr.com/3085/2800643267_aa1dd46299_t.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;Under git version 1.5.4.3, which as of writing is the current in ubuntu 8.04 hardy heron, trying to split out a folder from a git repo where the repo was an import from subversion (svn), and the folder was renamed in the past causes a failure as show below:&lt;br /&gt;&lt;br /&gt;&lt;code style="clear:both"&gt;#!/bin/bash -v&lt;br /&gt;rm -rf test-case&lt;br /&gt;mkdir test-case&lt;br /&gt;cd test-case/&lt;br /&gt;svnadmin create svnrepo&lt;br /&gt;export repo="`pwd`/svnrepo"&lt;br /&gt;mkdir -p import/a&lt;br /&gt;echo '1' &gt;&gt; import/a/file.txt&lt;br /&gt;svn import -m 'initial import' import file://$repo/trunk/&lt;br /&gt;svn co file://$repo/trunk/ checkout&lt;br /&gt;echo '2' &gt;&gt; checkout/a/file.txt&lt;br /&gt;svn ci -m "file modified" checkout&lt;br /&gt;svn mv -m "moving file" file://$repo/trunk/a file://$repo/trunk/b&lt;br /&gt;svn up checkout&lt;br /&gt;echo '3' &gt;&gt; checkout/b/file.txt&lt;br /&gt;svn ci -m "modified again" checkout&lt;br /&gt;svn log -v checkout&lt;br /&gt;mkdir -p gitcopy/a&lt;br /&gt;git svn clone file://$repo/trunk/ gitcopy/a&lt;br /&gt;cd gitcopy/a&lt;br /&gt;&lt;strong&gt;git filter-branch --subdirectory-filter a     #fails [1]&lt;/strong&gt;&lt;br /&gt;cd ../../&lt;br /&gt;mkdir gitcopy/b&lt;br /&gt;git svn clone file://$repo/trunk/ gitcopy/b&lt;br /&gt;cd gitcopy/b&lt;br /&gt;git filter-branch --subdirectory-filter b&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The marked line above fails with the following error:&lt;br /&gt;[1] Rewrite bcfe73ef303832b6112a2419dc1da5f782672c14 (3/3)fatal: Not a valid object name bcfe73ef303832b6112a2419dc1da5f782672c14:a&lt;br /&gt;&lt;br /&gt;This has been fixed in the latest build of git: version 1.6.0.1.294.gda06a and no longer fails.&lt;br /&gt;&lt;br /&gt;The "fatal: Not a git repository" error message that filter branch produces doesn't seem to matter.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2621355116425651592?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2621355116425651592/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2621355116425651592' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2621355116425651592'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2621355116425651592'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/09/error-not-valid-object-name-filtering.html' title='error &quot;Not a valid object name&quot; filtering an ex-svn git repo with renames'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3085/2800643267_aa1dd46299_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7821587094191713961</id><published>2008-08-24T15:03:00.006Z</published><updated>2008-10-01T18:43:57.360Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='sys admin'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>reseting home folder permissions in ubuntu linux</title><content type='html'>&lt;a href="http://www.flickr.com/photos/tim_abell/2792157421/"&gt;&lt;img style="border: medium none ; margin: 0pt 1em 1em 0pt; float: left;" src="http://farm4.static.flickr.com/3226/2792157421_2b8a33c6c6_m.jpg" alt="" /&gt;&lt;/a&gt; If you are like me and my coworkers, you often end up running stuff as root in your home folder and end up not able to access your own files.&lt;br /&gt;&lt;br /&gt;For the record, here's the commands to reset the permissions (leaving all execute flags off, which may not be what you want).&lt;br /&gt;&lt;div style="clear: both;"&gt;&lt;br /&gt;&lt;code&gt;#become root (as you don't currently have permissions to modify your own files)&lt;br /&gt;sudo -i&lt;br /&gt;#go to parent folder&lt;br /&gt;cd /home/tim&lt;br /&gt;#reset ownership &amp;amp; group to yourself&lt;br /&gt;chown -R tim:tim targer-folder&lt;br /&gt;#give yourself the default read-write permissions, set group and other to read only&lt;br /&gt;chmod -R 644 targer-folder&lt;br /&gt;#re-apply excecute permissions on all the directories&lt;br /&gt;find targer-folder -type d -print0 | xargs -0 -II chmod 755 'I'&lt;br /&gt;# don't leave your private keys showing:&lt;br /&gt;chmod 700 .ssh&lt;br /&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;My latest use for this was after extracting files from my p910i with p3nfs, which as with so many desktop/device tasks needed root to work.&lt;br /&gt;&lt;br /&gt;you could do this slightly more neatly if you know what permissions you have ended up with by using chmod u+w etc so you don't have to re-apply directory permissions, but I wanted to easily guarantee permissions are right regardless off what state they have ended up in.&lt;br /&gt;&lt;br /&gt;It occurs to me it might be sensible to set the sticky bit on the home folders so that anything added by root stays owned by the user. (chmod u+s g+s /home/tim)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7821587094191713961?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7821587094191713961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7821587094191713961' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7821587094191713961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7821587094191713961'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/08/reseting-home-folder-permissions-in.html' title='reseting home folder permissions in ubuntu linux'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3226/2792157421_2b8a33c6c6_t.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-3207018266105951792</id><published>2008-07-23T22:28:00.006Z</published><updated>2008-07-24T18:21:38.453Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='rant'/><category scheme='http://www.blogger.com/atom/ns#' term='drm'/><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Don't trust audible.com, it's drm infected and they don't tell you</title><content type='html'>If there's one thing I hate (there isn't, there's lots, but this is today's) it's companies being economical with the truth to get you to part with your money, only to have you disappointed when you find out the whole truth.&lt;br /&gt;&lt;br /&gt;I just bought an audio book on audible.co.uk. And now I can't even listen to it. I thought I was buying an mp3, or maybe even an ogg file. It is only on actually attempting to download the thing I have just paid for that I discover to my utter disgust that &lt;em&gt;all&lt;/em&gt; the download links are for some kind of evil drm type program (I presume here, but there sure as hell was no mp3 in sight).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/2697164218/"&gt;&lt;img src="http://farm4.static.flickr.com/3141/2697164218_1fc49eed23.jpg" alt="audible.com screenshot claiming mp3 support" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see from the screenshot above, they clearly imply an mp3 download. I haven't seen such a clear use of weasel sales words for some time.&lt;br /&gt;&lt;br /&gt;Next time I'll read the god damn small print, but I still think this is totally out of order not warning that they are providing crippled versions of what you think you are buying.&lt;br /&gt;&lt;br /&gt;Thank fsm for people like the FSF. Their logo really sums up how I feel about being treated in this way.&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://www.defectivebydesign.org/join/button"&gt;&lt;img src="http://defectivebydesign.org/sites/nodrm.civicactions.net/files/images/elim_lg_btn.gif" alt="Eliminate DRM!" align="middle" border="0" height="32" width="110" /&gt;&lt;br /&gt;&lt;small&gt;Protect your freedom!&lt;/small&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;span style="font-style: italic;"&gt;Update: credit where due. 24th July 2008.&lt;/span&gt;&lt;br /&gt;My complaint about the website still stands, and my aversion to drm has not diminished, however the responses I have received from their customer service (by email), have been prompt, courteous and have totally resolved my outstanding problem.  I have been given a full refund. I've been especially impressed given the hot blooded content of my initial contact. A lot of companies could learn lessons in good customer relations from these people.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-3207018266105951792?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/3207018266105951792/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=3207018266105951792' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3207018266105951792'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3207018266105951792'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/07/dont-trust-audiblecom-its-drm-infected.html' title='Don&apos;t trust audible.com, it&apos;s drm infected and they don&apos;t tell you'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3141/2697164218_1fc49eed23_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7075437710635550862</id><published>2008-07-16T14:34:00.003Z</published><updated>2008-07-16T14:38:13.825Z</updated><title type='text'>work at emapsite</title><content type='html'>The company I work for, emapsite is hiring a developer.&lt;br /&gt;Interviews are starting so you'll have to be quick.&lt;br /&gt;&lt;br /&gt;More details available on their &lt;a href="http://www.emapsite.com/news/viewnews.aspx?story=160"&gt;news item&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7075437710635550862?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7075437710635550862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7075437710635550862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7075437710635550862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7075437710635550862'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/07/work-at-emapsite.html' title='work at emapsite'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-581336541837888339</id><published>2008-07-14T21:37:00.002Z</published><updated>2008-07-26T15:30:15.848Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='carpc'/><title type='text'>New wiki, mostly for car pc</title><content type='html'>I've created a wiki at &lt;a href="http://www.wikispaces.com/"&gt;wikispaces.com&lt;/a&gt;, to document things that are less transient than a blog entry.&lt;br /&gt;&lt;br /&gt;Take a look at &lt;a href="http://timwise.wikispaces.com/"&gt;http://timwise.wikispaces.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've started adding information about the car pc, and won't make any promises about what else I'll be adding (personal motto: under promise, over deliver).&lt;br /&gt;&lt;br /&gt;I've made it open to all editors, and licensed under the GNU Free documentation licence to ensure the maximum value, reach and participation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-581336541837888339?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/581336541837888339/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=581336541837888339' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/581336541837888339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/581336541837888339'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/07/new-wiki-mostly-for-car-pc.html' title='New wiki, mostly for car pc'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2690488523107244834</id><published>2008-07-03T19:30:00.006Z</published><updated>2008-07-03T19:59:11.428Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='active directory'/><category scheme='http://www.blogger.com/atom/ns#' term='shameless plug'/><category scheme='http://www.blogger.com/atom/ns#' term='sys admin'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Nightly Shutdown, a new product from Proven Works</title><content type='html'>Congratulations to Joel Mansford, a good friend of mine, and his company &lt;a href="http://www.provenworks.com/"&gt;Proven Works&lt;/a&gt; on getting the &lt;a href="http://joelmansford.wordpress.com/2008/07/02/new-utility-to-shutdown-your-network-pcs-at-night/"&gt;first release&lt;/a&gt; of &lt;a href="http://www.nightlyshutdown.com/"&gt;Nightly Shutdown&lt;/a&gt; out of the door.&lt;br /&gt;&lt;br /&gt;This looks to be a great product and hopefully will make system administrators' lives easier and greener. It's a utility for ensuring that the computers are off when you want them to be, and can be deployed through active directory making the sys admin's life easier. There's a 10 PC free trial available, so check it out at the &lt;a href="http://www.nightlyshutdown.com/DownloadRequest.aspx"&gt;download page&lt;/a&gt;.&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.nightlyshutdown.com/"&gt;&lt;img src="http://www.timwise.co.uk/images/blog/nightly-shutdown.png" alt="Nightly Shutdown poster" style="border: medium none ;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;Without even looking I know this will be a good product and fantastically well supported. Best of luck to all at Proven Works, and to all the potential users and buyers out there, don't forget to check it out and provide any feedback you can.&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2690488523107244834?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2690488523107244834/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2690488523107244834' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2690488523107244834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2690488523107244834'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/07/nightly-shutdown-new-product-from.html' title='Nightly Shutdown, a new product from Proven Works'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-6325738989654501442</id><published>2008-06-06T21:36:00.007Z</published><updated>2008-06-07T01:07:24.569Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='opinion'/><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><category scheme='http://www.blogger.com/atom/ns#' term='carpc'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>A vision of open in-car computing systems</title><content type='html'>I have a vision. A vision that puts you in control of your in car computing experience.&lt;br /&gt;&lt;br /&gt;There are many superb appliances and embedded devices available for your in-car enjoyment, such as the sat navs, the dvd players, the built in games consoles. But they all share one thing in common, they are closed to you. You don't have the &lt;a href="http://www.fsf.org/about/what-is-free-software"&gt;freedoms&lt;/a&gt; defined by Stallman because they are designed, intentionally or otherwise, to be hard for you to modify as you wish.&lt;br /&gt;&lt;br /&gt;I feel deep in my heart that there is enormous potential for in-car computing. There are more possibilities than any individual or company can imagine or provide on their own. I'm sure my imagination is not big enough to list them here, so I leave the ideas for you to contemplate.&lt;br /&gt;&lt;br /&gt;Add to this, the evidence and my experience that open source when done right produces the better engineered solution at a lower cost, and you have a compelling argument for such a system.&lt;br /&gt;&lt;br /&gt;I have seen the freedom that open source and the GPL provide on the desktop computer, and I believe that this culture of openness and freedom for the users can be applied to the in-car computing market to the benefit of all.&lt;br /&gt;&lt;br /&gt;My mission is to provide a basis for this innovation, and cultivate a thriving ecosystem in the way that only open systems can. And so, my vision is a range of affordable flexible and most importantly open computing devices for your car.&lt;br /&gt;&lt;br /&gt;&lt;p style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/tim_abell/2556406175/"&gt;&lt;img src="http://farm4.static.flickr.com/3155/2556406175_90cc267ae1.jpg" alt="front view of voompc case" style="border: medium none ;" /&gt;&lt;/a&gt;&lt;/p&gt;And so, I introduce to you in the above photo, the mark one of my in-car pc. It has no name, and the software and hardware needs some work to say the least, but in the tradition of openness on the internet, I will present here my ups and downs, successes and failures, genius and downright stupidity for your entertainment.&lt;br /&gt;&lt;br /&gt;I have minimal spare time and numerous other projects, but there is no rush, as I think this plan will stand the test of time, and all the while hardware gets cheaper, smaller, faster and less power hungry. As I progress in fits and starts I will post photos to flickr under the tag carpc (&lt;a href="http://www.flickr.com/photos/tim_abell/sets/72157605474187579/"&gt;first set&lt;/a&gt;) and progress updates to this blog under tag &lt;a href="http://timwise.blogspot.com/search/label/carpc"&gt;carpc&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;All feedback welcome. I will announce new articles on my twitter feed, &lt;a href="http://twitter.com/tim_abell"&gt;twitter.com/tim_abell&lt;/a&gt;, and can be contacted using the links at the bottom of my blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-6325738989654501442?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/6325738989654501442/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=6325738989654501442' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6325738989654501442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6325738989654501442'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/06/vision-of-open-in-car-computing-systems.html' title='A vision of open in-car computing systems'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3155/2556406175_90cc267ae1_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-4719348621403422584</id><published>2008-05-29T23:36:00.007Z</published><updated>2008-06-04T17:18:17.112Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>sharing work between computers with a usb flash drive and git</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/tim_abell/2500350904/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://farm4.static.flickr.com/3180/2500350904_0b0c2a44f3_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;I couldn't find anything exactly matching this on the net when I was figuring it out, so here's what I did.&lt;br /&gt;&lt;br /&gt;This is working against a remote svn (subversion) server, but applies even without one.&lt;br /&gt;&lt;br /&gt;On the first computer, grab your git working copy from svn with git-svn clone (or clone a git repo, or just start a new one).&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir ~/project.git&lt;br /&gt;cd ~/project.git&lt;br /&gt;git-svn clone svn://project-server/trunk&lt;br /&gt;git repack #for good measure&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Plugin your usb flash drive/stick/external harddrive, I'll presume it's a vfat/fat32/fat16 formated device mounted at /media/flash.&lt;br /&gt;Create an empty repository on the drive, I'll use a bare one as there's no need to keep the working copy as well.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir /media/flash/project.git&lt;br /&gt;git --bare init /media/flash/project.git&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then add the flash drive git repo as a remote source in your local git repo. "flash" is the name I've given to the remote branch  reference, you can call it whatever you like.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git remote add flash /media/flash/project.git&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you push immediately it will fail (as I discovered) because fat doesn't support the execute flag on files, so all the hooks are automatically active. I deleted all the hooks as I wasn't planning on using them, this may be wrong so no promises, but it seems ok so far for me. So remove the hooks with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;rm /media/flash/project.git/hooks/*&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then push your current local copy to the flash drive with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git push flash&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This will copy all your committed work onto the flash drive, even if you haven't pushed it upstream to the svn server with "git-svn dcommit" yet. Bonus! It won't copy any of your branches across though, so you if you want them you can add those independently with:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git push flash mybranch&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Now move over to the second computer and plug the flash drive in. I'm making the same assumptions on paths and devices. Do another completely independent svn checkout as above:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;mkdir ~/project.git&lt;br /&gt;cd ~/project.git&lt;br /&gt;git-svn clone svn://project-server/trunk&lt;br /&gt;git repack #for good measure&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Then add the flash drive's repo to the git repo on the second pc and pull all changes from the flash drive, optionally including any branches:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git remote add flash /media/flash/project.git&lt;br /&gt;git pull flash master&lt;br /&gt;git pull flash mybranch #if you like&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;When you've committed changes to git or pulled the latest changes from svn on either pc, you can then update the flash drive with the simple command:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git push flash&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Which pushes all your changes on your master branch on to the flash  drive. You are now ready to run the pull command on the other computer to get back in sync:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;git pull flash master&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;If you don't push changes to the flash drive before committing to svn then things will be very simple. If you push changes to the flash drive, and then commit them to the svn server you will need to do a little more work. This is because when you run "git svn dcommit" it pushes your latest git commits to the svn server, deletes your locally committed changes, and then fetches them back from the svn server. This means that git won't recognise your local changes as being the same as the ones on the flash drive because they have different commit message and SHA1 hash. Attempting to push to the flash drive fails with the message "! [rejected] master -&gt; master (non-fast forward)" as the old copy of the commits are still there.&lt;br /&gt;&lt;br /&gt;To resolve this you need to throw away the matching set of changes on the flash drive. To do this you can use git reset as follows, where HEAD~1 should be the number of commits you need to throw away (eg HEAD~3 to throw away the last 3 commits that were pushed to the flash drive):&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd /media/flash/project.git&lt;br /&gt;git --bare log   #to see how many changes don't have svn information&lt;br /&gt;git --bare reset HEAD~1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can then push your changes as above.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;cd ~/project.git&lt;br /&gt;git push flash&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I've glossed over subtleties with fetch vs pull, but hopefully you will find this useful.&lt;br /&gt;&lt;br /&gt;This howto makes use of git's ability to pull from multiple sources, and I've found that git quite happily copes with changes that were checked in to svn coming via the flash drive, even when later running "git-svn rebase".&lt;br /&gt;&lt;br /&gt;Please do comment or contact me with any problems, errors, extra info and feedback, and let me know if it was useful.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-4719348621403422584?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/4719348621403422584/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=4719348621403422584' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4719348621403422584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4719348621403422584'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/05/sharing-work-between-computers-with-usb.html' title='sharing work between computers with a usb flash drive and git'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3180/2500350904_0b0c2a44f3_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-4979805774645728647</id><published>2008-05-17T20:33:00.003Z</published><updated>2008-05-17T20:37:24.778Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Removing the execute flag from many files</title><content type='html'>Here's how to recursively remove execute permissions on files that have been copied from a windows system.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;find * -type f -exec chmod -x {} \;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;ie, find all files (not directories), and execute a command to remove all execute permissions for each file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-4979805774645728647?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/4979805774645728647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=4979805774645728647' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4979805774645728647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4979805774645728647'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/05/removing-execute-flag-from-many-files.html' title='Removing the execute flag from many files'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-3985300694543528147</id><published>2008-03-31T21:37:00.007Z</published><updated>2008-04-26T13:50:39.053Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>My bash prompt</title><content type='html'>I like a new line in my prompt so that if I'm deep in a path I don't end up with 10 characters left to type in, and pretty colours so that it's easy to spot the prompt when scrolling through lots of output.&lt;br /&gt;&lt;br /&gt;Update 26/04/2008, added red for root.&lt;br /&gt;&lt;br /&gt;From my ~/.bashrc&lt;br /&gt;&lt;code&gt;# Comment in the above and uncomment this below for a color prompt&lt;br /&gt;if [ $UID = 0 ] ;then&lt;br /&gt;PS1='${debian_chroot:+($debian_chroot)}\[\033[00;31m\]\u@\h\[\033[00m\]:\[\033[00;34m\]\w\[\033[00m\]\n\$&amp;nbsp;'&lt;br /&gt;else&lt;br /&gt;PS1='${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u@\h\[\033[00m\]:\[\033[00;34m\]\w\[\033[00m\]\n\$&amp;nbsp;'&lt;br /&gt;fi&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The result (more or less):&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;tim@lap&lt;/span&gt;:&lt;span style="color: rgb(102, 0, 204);"&gt;~/Documents&lt;/span&gt;&lt;br /&gt;$ echo "That's better"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-3985300694543528147?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/3985300694543528147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=3985300694543528147' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3985300694543528147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3985300694543528147'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/03/my-bash-prompt.html' title='My bash prompt'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-4371985220813850741</id><published>2008-03-27T21:29:00.007Z</published><updated>2011-04-24T07:58:44.332Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='animation'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>stop motion animation on linux</title><content type='html'>A quick howto...&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Take a series of photos on your digital camera.&lt;/li&gt;&lt;li&gt;Copy them onto your linux box.&lt;/li&gt;&lt;li&gt;shrink the photos to a more managable size:&lt;br /&gt;&lt;code&gt;mogrify -verbose -resize 600x400 -quality 60% *.JPG&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Preview the animation with animate:&lt;br /&gt;&lt;code&gt;animate -delay 8 *&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Optionally rotate the image to match the exif information from your camera (mine was sideways):&lt;br /&gt;&lt;code&gt;exiftran -ai *&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Convert the jpg files to png:&lt;br /&gt;mogrify -format png *.JPG&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Create the flash animation from the PNG files:&lt;br /&gt;&lt;code&gt;png2swf -r 15 -o flower2.swf -v -X 399 -Y 600 *.png&lt;/code&gt;&lt;/li&gt;&lt;li&gt;Create an html file to hold the animation containing the following:&lt;br /&gt;&lt;pre&gt;&amp;lt;object&amp;gt;&lt;br /&gt;&amp;lt;param name=&amp;quot;movie&amp;quot; value=&amp;quot;flower2.swf&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;param name=&amp;quot;loop&amp;quot; value=&amp;quot;true&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;param name=&amp;quot;quality&amp;quot; value=&amp;quot;high&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;embed src=&amp;quot;flower2.swf&amp;quot; width=&amp;quot;399&amp;quot; height=&amp;quot;600&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/object&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:Georgia,serif;"&gt;Write a blog article to tell everyone about it ;-)&lt;br /&gt;"history" is a handy command for reviewing your activities for writing up your achievements.&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;And here it is, providing I've kept up with my hosting fees and not been slashodotted:&lt;br /&gt;&lt;object&gt;&lt;br /&gt;&lt;param name="movie" value="http://timwise.co.uk/photos/flower2.swf"&gt;&lt;br /&gt;&lt;param name="loop" value="true"&gt;&lt;br /&gt;&lt;param name="quality" value="high"&gt;&lt;br /&gt;&lt;embed src="http://timwise.co.uk/images/blog/flower2.swf" height="600" width="399"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-4371985220813850741?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/4371985220813850741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=4371985220813850741' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4371985220813850741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/4371985220813850741'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/03/stop-motion-animation-on-linux.html' title='stop motion animation on linux'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7104045740264013043</id><published>2008-01-30T18:51:00.001Z</published><updated>2008-06-02T15:06:04.721Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='mcp'/><category scheme='http://www.blogger.com/atom/ns#' term='mcts'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Tech support at its worst</title><content type='html'>As you may know, I'm working through a Microsoft e-learning course at the moment. Having had a &lt;a href="http://www.flickr.com/photo_zoom.gne?id=2206580619&amp;amp;size=o"&gt;few problems&lt;/a&gt; with the service I've been trying to extract some common sense from their support services. Having failed to get anything vaguely helpful I thought I'd ask them about who they were, and I think the following response really sums up the level of idiocy I have encountered thus far.&lt;br /&gt;&lt;br /&gt;When asked a simple direct question about who I was communicating with, the response is either hilarious or depressing, I'm not sure which. It would seem that before they can tell me where they are based, they need to know what operating system I run, what version of flash I have, what my login is etc etc. Talk about customer disservice. The finishing touch for me is the addition of upbeat advertising added to a response to an evidently already irritated customer.&lt;br /&gt;&lt;br /&gt;Here are the last two messages for your entertainment (identifiers stripped out):&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;-------- Original Message --------&lt;br /&gt;Subject:  Re: MCP Ref: C ###### \ site broken. (########)&lt;br /&gt;Date:  Thu, 24 Jan 2008 16:03:12 +0000&lt;br /&gt;From:  Tim &lt;tim@timwise.co.uk&gt;&lt;br /&gt;To:  emeamcp@msdirectservices.com &lt;emeamcp@msdirectservices.com&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I have a couple of questions for you:&lt;br /&gt;&lt;br /&gt;What company are you directly employed by?&lt;br /&gt;Where are you based?&lt;br /&gt;&lt;br /&gt;Thanks&lt;br /&gt;&lt;br /&gt;Tim&lt;br /&gt;&lt;br /&gt;&lt;/emeamcp@msdirectservices.com&gt;&lt;/tim@timwise.co.uk&gt;&lt;/blockquote&gt;&lt;br /&gt;The highly considered response:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;-------- Original Message --------&lt;br /&gt;Subject:  MCP Ref: C ##### \ site broken. (#######################)&lt;br /&gt;Date:  Wed, 30 Jan 2008 15:59:21 +0100 (CET)&lt;br /&gt;From:  emeamcp@msdirectservices.com &lt;emeamcp@msdirectservices.com&gt;&lt;br /&gt;To:  Tim &lt;tim@timwise.co.uk&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hello Tim,&lt;br /&gt;&lt;br /&gt;Thank you for contacting Learning Manager Support.&lt;br /&gt;&lt;br /&gt;In order for us to process this request, we need the following&lt;br /&gt;information from you:&lt;br /&gt;&lt;br /&gt;- Step by step screen shots of the entire process including the error&lt;br /&gt;message&lt;br /&gt;&lt;br /&gt;- Your log in Live ID and the Unique ID associated to it.&lt;br /&gt;&lt;br /&gt;To obtain your Unique ID, please follow the steps provided:&lt;br /&gt;&lt;br /&gt;1) Visit http://account.live.com&lt;br /&gt;&lt;br /&gt;2) Sign in using your passport account.&lt;br /&gt;&lt;br /&gt;3) After singing in you will see a page with more options. Please click&lt;br /&gt;on 'Registered information'&lt;br /&gt;&lt;br /&gt;4) At the bottom of this page you will see your Unique ID. It will look&lt;br /&gt;like this: '000XXXXXXXXXXXXX'&lt;br /&gt;&lt;br /&gt;- Detailed description of what the problem/issue is that you are&lt;br /&gt;experiencing.&lt;br /&gt;&lt;br /&gt;- What is the Operating System that you are using?&lt;br /&gt;&lt;br /&gt;- What is the Internet Browser and version that you are using?&lt;br /&gt;&lt;br /&gt;- What version of Flash and Shockwave are you using?&lt;br /&gt;&lt;br /&gt;- Screenshot of the following webpage: https://learning.microsoft.com/Commerce/PurchaseHistory.aspx&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;While some of the above information may not seem applicable to your&lt;br /&gt;issue, it is important that we must receive them in order to best&lt;br /&gt;resolve your issue.&lt;br /&gt;&lt;br /&gt;Please also note that we unfortunately are not allowed to provide you&lt;br /&gt;any information about our location.&lt;br /&gt;&lt;br /&gt;Looking forward to receiving your reply.&lt;br /&gt;&lt;br /&gt;Kind Regards&lt;br /&gt;&lt;br /&gt;Natalia Wojtaszek&lt;br /&gt;&lt;br /&gt;Microsoft Regional Service Center&lt;br /&gt;E-Mail: emeamcp@msdirectservices.com&lt;br /&gt;Tel.: 0800-9170758 or 0800 0960137&lt;br /&gt;Fax: ++49 5 24 11 79 60 77&lt;br /&gt;&lt;br /&gt;In order to keep up to date with the MCP/ MCT program your contact&lt;br /&gt;details need to be correct.&lt;br /&gt;&lt;br /&gt;Don´t forget: You can update your contact details yourself in the&lt;br /&gt;Profile Editor on the MCP/ MCT Secure Site at&lt;br /&gt;&lt;https: com="" mcp=""&gt; !&lt;br /&gt;&lt;br /&gt;NOW AVAILABLE: Virtual PC-enabled Labs in Official Microsoft Learning&lt;br /&gt;Products https://partnering.one.microsoft.com/mct/vpc/default.aspx&lt;br /&gt;&lt;br /&gt;Microsoft highly recommends that users with Internet access update their&lt;br /&gt;Microsoft software to protect against viruses and security&lt;br /&gt;vulnerabilities. The easiest way to do this is to visit the following&lt;br /&gt;website:   http://www.Microsoft.com/protect&lt;br /&gt;&lt;/https:&gt;&lt;/tim@timwise.co.uk&gt;&lt;/emeamcp@msdirectservices.com&gt;&lt;/blockquote&gt;&lt;br /&gt;It's worth noting that this is totally consistent with the level of service I have experienced with Microsoft e-learning. As far as I can fathom, the e-learning system has been set up on a pile of servers and then been left to rot whilst paying customers are fobbed off by a nameless and faceless 3rd party. It may be profitable in the short term, but this kind of behaviour may well be the cracks in the foundations of Microsoft's empire. I for one am certainly plotting a course for fairer pastures.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7104045740264013043?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7104045740264013043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7104045740264013043' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7104045740264013043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7104045740264013043'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2008/01/tech-support-at-its-worst.html' title='Tech support at its worst'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-8312628495426408900</id><published>2007-12-28T19:28:00.003Z</published><updated>2008-10-04T23:47:09.540Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Preparing photos for a digital picture frame</title><content type='html'>Challenge of the day was to fit as many photos as possible on a single flash card to stick in a digital photo frame. Here's how it's done.&lt;br /&gt;&lt;br /&gt;The frame from Philips goes by the memorable name of &lt;a href="http://www.consumer.philips.com/consumer/en/ca/consumer/cc/_productid_9FF2M4_37_CA_CONSUMER/"&gt;9FF2M4&lt;/a&gt; , and by way of a quick review it is very nice. If I were a normal person, I would probably have copied the original 2.5MB / 5 megapixel images to the frame's flash card (1GB Compact Flash in this case, though it can take others), and put up with not being able to fit &lt;span style="font-style: italic;"&gt;all&lt;/span&gt; the photos on, and having some of them show sideways. But being a perfectionist I instead sacrificed precious sleeping time to figure out what to do. In the end I managed to trim the files down to around 200KB each, and put portrait photos on  a black background the right way up in order to save neck ache from squinting at a sideways eiffel tower. This was all done by the power of OSS and bash scripting. Here I present for your convenience the methods I used, and highlight some of the useful things I picked up along the way.&lt;br /&gt;&lt;br /&gt;The first thing that taxed me was what size the photos needed to be to display best whilst taking up minimal space. You would think the answer would be emblazened on the product's box, but no! Philips don't seem to be too keen on promoting the resolution of the display, and even the shop keeper struggled to give me a number. The owner's manual states: "Resolution: 800 x 480 pixels (viewing area 680 x 480)" but after some time experimenting with test images created with &lt;a href="http://gimp.org/"&gt;the gimp&lt;/a&gt; I came to the conclusion that it was impossible to get the frame to display an image pixel perfect as it seemed to be re-scaling every picture regardless of original size. There appears to be no guidance from Philips as to what a good resolution for the photos would be, so after some experimentation I settled on 800x600 as this is slightly higher than the frame's native resolution, and fills the screen nicely without loosing too much off the edges when displayed.&lt;br /&gt;&lt;br /&gt;The frame does not appear to read orientation from the exif data so I looked into rotating all the portrait images to display correctly. I am using the frame in its landscape orientation as that is the form of most of the photos, even though it can be placed in portrait orientation. When a portrait photos is displayed (eg 480x600), the frame puts a fair amount of the image off the top and bottom of the display, and by default puts it on a full white background which is a little hard on the eyes and detracts from darker photos. I therefore opted to create landscape images of 800x600 with a black background for all the portrait photos. I later discovered that you can on this frame change the background colour as follows: Main menu &gt; Slideshow &gt; Background colour &gt; White / Black Grey.&lt;br /&gt;&lt;br /&gt;The process I have used is a little specific to my setup and needs, but hopefully will give you a good starting point. I have created 3 bash scripts that call each other to orchestrate the conversion from my raw photo collection to a new set suitable for the frame, which in turn make use of imageMagick and exiftran to do the work.&lt;br /&gt;&lt;br /&gt;I found out about &lt;a href="http://www.imagemagick.org/"&gt;imageMagick&lt;/a&gt; through searching, and tutorials such as &lt;a href="http://www.smokinglinux.com/tutorials/howto-batch-image-resize-on-linux"&gt;HowTo - Batch Image Resize on Linux&lt;/a&gt;. The version packaged with Ubuntu 7.10 is quite old, so I ended up building and installing the latest version (6.3.7) from source to get all the functionality I needed.&lt;br /&gt;&lt;br /&gt;exiftran is a nifty utility that reads the exif orientation information in a photo, losslessly rotates the photo to match and then updates the exif data. It is closely related to jpegtran.&lt;br /&gt;&lt;br /&gt;My folder structure in my home folder (so the scripts make sense):&lt;br /&gt;&lt;ul&gt;&lt;li&gt;scripts (for bash scripts)&lt;/li&gt;&lt;li&gt;photos (originals)&lt;br /&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;2005&lt;/li&gt;&lt;ul&gt;&lt;li&gt;2005-12-31 event name&lt;/li&gt;&lt;li&gt;etc&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;2006&lt;/li&gt;&lt;li&gt;etc&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;photos_frame (for the modified and shrunk photos which will be copied onto the flash card)&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;So without further ado, here's the scripts:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;frame.sh&lt;/strong&gt; - runs the processing scripts on each year folder of interest&lt;br /&gt;&lt;code&gt;#!/bin/bash -v&lt;br /&gt;~/scripts/frame_photo_folder.sh 2005 ~/photos_frame/&lt;br /&gt;~/scripts/frame_photo_folder.sh 2006 ~/photos_frame/&lt;br /&gt;~/scripts/frame_photo_folder.sh 2007 ~/photos_frame/&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;frame_photo_folder.sh&lt;/strong&gt; - runs the processing script on subfolder of the year&lt;br /&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;#arg 1 = input folder&lt;br /&gt;#arg 2 = output folder&lt;br /&gt;&lt;br /&gt;INPUTPATH=$1&lt;br /&gt;OUTPATH=$2&lt;br /&gt;cd $INPUTPATH&lt;br /&gt;if [ ! -d "$OUTPATH$INPUTPATH" ]&lt;br /&gt;then&lt;br /&gt;echo creating output folder \"$OUTPATH$INPUTPATH\"&lt;br /&gt;mkdir $OUTPATH$INPUTPATH&lt;br /&gt;fi&lt;br /&gt;for fname in *&lt;br /&gt;do&lt;br /&gt;if [ -d "$fname" ]&lt;br /&gt;then&lt;br /&gt;if [ ! -d "$OUTPATH$INPUTPATH/$fname" ]&lt;br /&gt;then&lt;br /&gt;echo creating output folder \"$OUTPATH$INPUTPATH/$fname\"&lt;br /&gt;mkdir "$OUTPATH$INPUTPATH/$fname"&lt;br /&gt;fi&lt;br /&gt;echo searching for jpg files in \"$fname\"&lt;br /&gt;cd "$fname"&lt;br /&gt;find . -maxdepth 1 -type f -name \*.JPG | xargs -iimgfile ~/scripts/frame_photo.sh "imgfile" "$OUTPATH$INPUTPATH/$fname"&lt;br /&gt;cd ..&lt;br /&gt;fi&lt;br /&gt;done&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;frame_photo.sh&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;creates output folder(s)&lt;/li&gt;&lt;li&gt;copies original photo into output folder&lt;/li&gt;&lt;li&gt;uses exiftran to rotate the photo to the correct orientation&lt;/li&gt;&lt;li&gt;shrinks the photo to a maximum of 800x600, and fills any remaining space with a black background&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;#arg 1 = photo file name&lt;br /&gt;#arg 2 = where to put result&lt;br /&gt;#resizes and pads suitable for a photo frame.&lt;br /&gt;&lt;br /&gt;INPUTFILE=$1&lt;br /&gt;OUTPATH=$2&lt;br /&gt;#pwd&lt;br /&gt;echo copying \"$INPUTFILE\" into \"$OUTPATH\"&lt;br /&gt;cp "$INPUTFILE" "$OUTPATH"&lt;br /&gt;cd "$OUTPATH"&lt;br /&gt;#pwd&lt;br /&gt;#echo processing \"$INPUTFILE\"&lt;br /&gt;exiftran -ai "$INPUTFILE"&lt;br /&gt;convert "$INPUTFILE" -resize '800x600&gt;' -background black -gravity center -extent 800x600 "$INPUTFILE"&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I timed the whole operation using the time command, and copied all output to a log file as follows.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;$ time ./frame.sh 2&gt;&amp;amp;1 | tee frame.log&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The conversion of around 6000 photos took around one and a half hours.&lt;br /&gt;&lt;br /&gt;The concept of redirection of stdout &amp;amp; stderr was neatly explained by the article &lt;a href="http://www.linux.com/articles/113686"&gt;CLI magic: need redirection?&lt;/a&gt;, so now I know that 2&gt;&amp;amp;1 means redirect ouput number two into output number one, in other words redirect stderr into stdout, which then alows you to pipe the whole lot into something else like "tee" (No, not tea, though it may be interesting redirecting my photos into my tea...)&lt;br /&gt;&lt;br /&gt;Add a comment or drop me a line if you find it interesting or useful or if you have any questions or criticisms.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt;I've worked this script into a small python gui app, check it out at &lt;a href="http://github.com/timabell/photo-frame-prep"&gt;http://github.com/timabell/photo-frame-prep&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-8312628495426408900?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/8312628495426408900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=8312628495426408900' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8312628495426408900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8312628495426408900'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/12/preparing-photos-for-digital-picture.html' title='Preparing photos for a digital picture frame'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-8211898069521983285</id><published>2007-12-09T01:41:00.001Z</published><updated>2007-12-09T03:13:46.284Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='inspiron 8500'/><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='laptop'/><category scheme='http://www.blogger.com/atom/ns#' term='proprietary'/><category scheme='http://www.blogger.com/atom/ns#' term='dell'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='composite video'/><category scheme='http://www.blogger.com/atom/ns#' term='hardware'/><category scheme='http://www.blogger.com/atom/ns#' term='nvidia'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Enabling TV-Out on Ubuntu Linux 7.10 on a Dell Inspiron 8500</title><content type='html'>This weekend, I finally got the tv-out working under linux (Ubuntu 7.10 aka gusty gibbon) on my laptop. Here's what was involved, including some of the (time consuming) red herrings involved in getting this set up.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/tim_abell/2096850378/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; width: 240px; height: 192px;" src="http://farm3.static.flickr.com/2419/2096850378_d98545fdc9_m.jpg" alt="" border="0" /&gt;&lt;/a&gt; I've included the full xorg.conf files for normal display and tv output at the end of this post.&lt;br /&gt;&lt;br /&gt;I used the composite video output as that's what I have cables for. I haven't ever tried the s-video output, and I haven't tried the digital audio output since I divorced microsoft windows and threw her things out into the rain a couple of years ago.&lt;br /&gt;&lt;br /&gt;The quality is pretty poor, but good enough. I think there's a limit of 800x600 for the video out. I'm getting a fair amount of interference on both the video and audio when the laptop is on mains and connected to my amplifier / tv. I'm not sure what the cause it but it's not bad enough to be  unusable.&lt;br /&gt;&lt;br /&gt;I installed the nvidia proprietary (that's a negative word in case you don't live in my world) drivers some time ago in order to get 3D acceleration, and I think this is a prerequisite to running the tv-out.&lt;br /&gt;&lt;br /&gt;In my intial investigation I came across &lt;a href="http://www.sorgonet.com/linux/nvoption/"&gt;nvoption&lt;/a&gt;, which in theory allows you to turn on the tv-out on the nvidia cards. I did manage to compile and run it after several hours of trial, error and finding build dependencies but when I finally got it built and running I found that it would seg fault when I hit the "apply" button, hurrah! In the process of playing with nvoption however, I noticed the &lt;a href="http://www.sorgonet.com/linux/nv-online/"&gt;nv-online&lt;/a&gt; page that this person has very generously set up. Reading this it dawned on me that nvoption purely modifies the /etc/X11/xorg.conf file, and that I don't actually &lt;span style="font-style: italic;"&gt;need&lt;/span&gt; the tool to get tv-out running. I had originally presumed (the brother of all ...) that the nvoption tool did some magical proprietary prodding of the graphics card directly. After a bit of searching to find out where the options should go (the device section), I was then able to use the &lt;a href="http://www.sorgonet.com/linux/nv-online/help.html"&gt;documentation of options&lt;/a&gt; in the second frame of the nv-online page to configure my own X. After a bit of experimenting with different options and lots of restarting of the X server (ctrl+alt+backspace) I was able to get the desired result of the display mirrored/cloned on both the lcd and the television.&lt;br /&gt;&lt;br /&gt;I tried the nvidia-settings gui tool that comes with the proprietary drivers, but it was no use for this task. This tool modifies the xorg.conf file. It did help me recently with a normal dual screen setup (using a crt monitor plugged into the vga port on the laptop), but it was no help for the tv-out, which was not even mentioned in the interface.&lt;br /&gt;&lt;br /&gt;There is a tool called displayconfig-gtk which is fairly new to Ubuntu that allows you to save named display profiles for different configurations (including dual screen, though it didn't quite behave for me). It can be found under System &gt; Administration &gt; Screens and Graphics. This stores an xorg.conf file for each profile in /var/lib/displayconfig-gtk/locations/, and an index file in /var/lib/displayconfig-gtk/locations.conf. This is almost ideal, as I have created a set of xorg.conf files for my various setups, however it doesn't seem to cope with applying these custom xorg files. Additionally nvidia seem to have a weird way of setting the screen to run at its native resolution of 1920x1600, and this tool doesn't cope with it. This was corrected by selecting the right resolution under System &gt; Preferences &gt; Screen Resolution.&lt;br /&gt;&lt;br /&gt;Sadly it looks like there are no tools for easy switching X configuration files, so the process for now is involves manually copying the config files. I've created multiple files in /etc/X11, one for each set up including xorg.conf_lcd and xorg.conf_tv. The switching process is then something along the lines of "cd /etc/X11/", "sudo cp xorg.conf_tv xorg.conf", ctrl+alt+backspace (restart x server).&lt;br /&gt;&lt;br /&gt;If it's any consolation I recall the process in windows involved starting from scratch in a distinctly non-intuitive gui and trying to get a whole load of settings just right, so being able to save the settings is a big step up. I think it took similar amounts of time to get tv-out running under windoze. I guess that's the price we pay for allowing companies to deny us access to the hardware specs so it can be integrated properly. I bought this laptop before I knew how much control I was giving away, and I endeavour not to make such mistakes these days.&lt;br /&gt;&lt;br /&gt;The "designed for windows xp" sticker has been moved to the equally shiny microwave oven which brings me a small piece of joy when I make porridge in the morning.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;xorg.conf for just the laptop screen&lt;br /&gt;&lt;code&gt;# nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;# nvidia-settings:  version 1.0  (buildmeister@builder3)  Mon Apr 16 20:38:05 PDT 2007&lt;br /&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;  Identifier     "Layout0"&lt;br /&gt;  Screen      0  "Screen0" 0 0&lt;br /&gt;  InputDevice    "Keyboard0" "CoreKeyboard"&lt;br /&gt;  InputDevice    "Mouse0" "CorePointer"&lt;br /&gt;  Inputdevice    "Synaptics Touchpad"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Files"&lt;br /&gt;  RgbPath         "/usr/X11R6/lib/X11/rgb"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Module"&lt;br /&gt;  Load           "dbe"&lt;br /&gt;  Load           "extmod"&lt;br /&gt;  Load           "type1"&lt;br /&gt;  Load           "freetype"&lt;br /&gt;  Load           "glx"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerFlags"&lt;br /&gt;  Option         "Xinerama" "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;  # generated from default&lt;br /&gt;  Identifier     "Mouse0"&lt;br /&gt;  Driver         "mouse"&lt;br /&gt;  Option         "Protocol" "auto"&lt;br /&gt;  Option         "Device" "/dev/psaux"&lt;br /&gt;  Option         "Emulate3Buttons" "no"&lt;br /&gt;  Option         "ZAxisMapping" "4 5"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;      Identifier      "Synaptics Touchpad"&lt;br /&gt;      Driver          "synaptics"&lt;br /&gt;      Option          "SendCoreEvents"        "true"&lt;br /&gt;      Option          "Device"        "/dev/psaux"&lt;br /&gt;      Option          "Protocol"      "auto-dev"&lt;br /&gt;      Option          "HorizScrollDelta"      "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;  # generated from default&lt;br /&gt;  Identifier     "Keyboard0"&lt;br /&gt;  Driver         "kbd"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;  # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;  Identifier     "Monitor0"&lt;br /&gt;  VendorName     "Unknown"&lt;br /&gt;  ModelName      "Sharp"&lt;br /&gt;  HorizSync       30.0 - 75.0&lt;br /&gt;  VertRefresh     60.0&lt;br /&gt;  Option         "DPMS"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;  Identifier     "Videocard0"&lt;br /&gt;  Driver         "nvidia"&lt;br /&gt;  VendorName     "NVIDIA Corporation"&lt;br /&gt;  BoardName      "GeForce4 4200 Go"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;  Identifier     "Screen0"&lt;br /&gt;  Device         "Videocard0"&lt;br /&gt;  Monitor        "Monitor0"&lt;br /&gt;  DefaultDepth    24&lt;br /&gt;  Option         "metamodes" "DFP: nvidia-auto-select +0+0"&lt;br /&gt;  SubSection     "Display"&lt;br /&gt;      Depth       24&lt;br /&gt;      Modes      "1600x1200" "1280x1024" "1024x768" "800x600" "640x480"&lt;br /&gt;  EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;xorg.conf for running the tv-out at 800x600, with the laptop displaying the same&lt;br /&gt;&lt;code&gt;# nvidia-settings: X configuration file generated by nvidia-settings&lt;br /&gt;# nvidia-settings:  version 1.0  (buildmeister@builder3)  Mon Apr 16 20:38:05 PDT 2007&lt;br /&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;  Identifier     "Layout0"&lt;br /&gt;  Screen      0  "Screen0" 0 0&lt;br /&gt;  InputDevice    "Keyboard0" "CoreKeyboard"&lt;br /&gt;  InputDevice    "Mouse0" "CorePointer"&lt;br /&gt;  Inputdevice    "Synaptics Touchpad"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Files"&lt;br /&gt;  RgbPath         "/usr/X11R6/lib/X11/rgb"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Module"&lt;br /&gt;  Load           "dbe"&lt;br /&gt;  Load           "extmod"&lt;br /&gt;  Load           "type1"&lt;br /&gt;  Load           "freetype"&lt;br /&gt;  Load           "glx"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerFlags"&lt;br /&gt;  Option         "Xinerama" "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;  # generated from default&lt;br /&gt;  Identifier     "Mouse0"&lt;br /&gt;  Driver         "mouse"&lt;br /&gt;  Option         "Protocol" "auto"&lt;br /&gt;  Option         "Device" "/dev/psaux"&lt;br /&gt;  Option         "Emulate3Buttons" "no"&lt;br /&gt;  Option         "ZAxisMapping" "4 5"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;      Identifier      "Synaptics Touchpad"&lt;br /&gt;      Driver          "synaptics"&lt;br /&gt;      Option          "SendCoreEvents"        "true"&lt;br /&gt;      Option          "Device"        "/dev/psaux"&lt;br /&gt;      Option          "Protocol"      "auto-dev"&lt;br /&gt;      Option          "HorizScrollDelta"      "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;  # generated from default&lt;br /&gt;  Identifier     "Keyboard0"&lt;br /&gt;  Driver         "kbd"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;  # HorizSync source: edid, VertRefresh source: edid&lt;br /&gt;  Identifier     "Monitor0"&lt;br /&gt;  VendorName     "Unknown"&lt;br /&gt;  ModelName      "Sharp"&lt;br /&gt;  HorizSync       30.0 - 75.0&lt;br /&gt;  VertRefresh     60.0&lt;br /&gt;  Option         "DPMS"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;  Identifier     "Videocard0"&lt;br /&gt;  Driver         "nvidia"&lt;br /&gt;  VendorName     "NVIDIA Corporation"&lt;br /&gt;  BoardName      "GeForce4 4200 Go"&lt;br /&gt;&lt;strong&gt;    Option "TwinView" "1"&lt;br /&gt;  Option "TwinViewOrientation" "Clone"&lt;br /&gt;  Option "MetaModes" "800x600, 800x600;"&lt;br /&gt;  Option "TVStandard" "PAL-I"&lt;br /&gt;  Option "ConnectedMonitor" "DFP,TV"&lt;/strong&gt;&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;  Identifier     "Screen0"&lt;br /&gt;  Device         "Videocard0"&lt;br /&gt;  Monitor        "Monitor0"&lt;br /&gt;  DefaultDepth    24&lt;br /&gt;  #Option         "metamodes" "DFP: nvidia-auto-select +0+0"&lt;br /&gt;  SubSection     "Display"&lt;br /&gt;      Depth       24&lt;br /&gt;      Modes      "1600x1200" "1280x1024" "1024x768" "800x600" "640x480"&lt;br /&gt;  EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-8211898069521983285?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/8211898069521983285/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=8211898069521983285' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8211898069521983285'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/8211898069521983285'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/12/enabling-tv-out-on-ubuntu-linux-710-on.html' title='Enabling TV-Out on Ubuntu Linux 7.10 on a Dell Inspiron 8500'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2419/2096850378_d98545fdc9_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-611806244445315811</id><published>2007-11-04T14:04:00.000Z</published><updated>2007-11-04T20:01:48.216Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='ideas'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Making money with free software</title><content type='html'>Business model #1!&lt;br /&gt;&lt;br /&gt;"Turning capital into code"&lt;br /&gt;&lt;br /&gt;I believe there is a viable business to be had running a software company in a novel fashion. Each project to create a new or improved piece of open source software would be funded by multiple contracts with businesses who have a need for the software. The software business would be run as a partnership ala &lt;a href="http://en.wikipedia.org/wiki/John_Lewis_Partnership"&gt;John Lewis&lt;/a&gt;, where the employees own the company.&lt;br /&gt;&lt;br /&gt;You can stop reading now, that was it. Move a long, no more useful thoughts here.&lt;br /&gt;&lt;br /&gt;Still here? Okay, if you insist I'll explain myself. I didn't have time to write you a short blog post, so I wrote you a long one.&lt;br /&gt;&lt;br /&gt;I'm always interested in how business is done. And the more I see, the more I start to realize that business doesn't have to involve exploiting people (wanna buy a ringtone?), it is in fact more usually an agreement where both parties benefit.&lt;br /&gt;&lt;br /&gt;Sure I could make a motorcar myself, but by the time I've finished tightening all the bolts in the mechano set it will probably have cost me fifty grand to make and do naught to sixty in pieces. Much better to buy a production car for fifteen grand and be happy that the manufacturer, sales person, mechanics etc take a percentage of &lt;span style="font-style: italic;"&gt;my&lt;/span&gt; money as, shock horror (communists look away now) ... profit! Besides didn't my money come from charging someone enough to make a profit anyway?...&lt;br /&gt;&lt;br /&gt;So, having alluded to the fact that I live in a capitalist society, I shall tell you what this has to do with open source / free software in my mind.&lt;br /&gt;&lt;br /&gt;By trade and by choice I'm a software developer, turning my hand to whatever variant of software is needed at the time, and not afraid to set up systems and databases if the need arises.&lt;br /&gt;&lt;br /&gt;I have for some time now been of the opinion that the open source method of development and distribution is superior to the proprietary (closed source) model, both as a user and as a developer. As a user, I find that community driven software generally does the things that are important well, and is significantly better supported due to the community that gathers around it. As a developer (though I have yet to run an open source project), I think that the direct, unfiltered feedback from users is better, the collaboration between developers is more effective, and there isn't a pressure to deviate from the correct solution to a problem into making pretty things that don't work. Having said all that,  all software is written by humans, so some projects fair better than others. There are limited resources on both sides of the fence so each has its own areas of strength and weakness in terms of quality and completeness.&lt;br /&gt;&lt;br /&gt;Okay, so I like open source software (OSS). So what?&lt;br /&gt;&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2354/1860676320_0f7da3bcfb_m.jpg" alt="impressive old glass roof" style="float: right; width: 240px; height: 180px;" height="180" width="240" /&gt;Well, you or I can make money with proprietary software by creating something desirable, then charging people for using it ala &lt;a href="http://www.joelonsoftware.com/articles/CamelsandRubberDuckies.html"&gt;Fog Creek&lt;/a&gt;. Which fits nicely in the capitalist world, and you can run your business as anything from evil empire (mention no names) to tree hugging near-as-damn-it open source and still turn a healthy profit. But that's never sat right with me because although I see the logic, you aren't really charging for the work you do, you are charging for an artificial restriction on redistribution. In other words I get enough investment together (time or money) to create the software in the first place, and get paid nothing for it. Then I sell it with virtually no overhead and hope to make up my initial investment, followed by a healthy profit. You can then use the healthy profit to improve the software, fund new software or attempt crush/buy the competition (maniacal laugh). Sure it works, but what if you could give your software away to the world once it has paid for itself? Wouldn't that make the world a better place? Well, that probably depends if you are creating restrictive crapware, but either way the way the answer is likely to be "Are you nuts?!! Throw away all that free profit?!".&lt;br /&gt;&lt;br /&gt;There is another business model around that is working very nicely for some people and companies. The "you want it, you pay for creating it" approach. This comes in two flavours. Very common is hiring a contractor / employee to create exactly what you desire even if you have no idea how to create software. This can be used to give a business an edge over its competition, or even to allow it to do business at all. This is a very expensive way of creating software (for that company) but is sometimes the only way. Some open source companies are expert at negotiating contracts to create custom software for profit, that software may then join the world's supply of open source software.&lt;br /&gt;&lt;br /&gt;Both of the above models fund a fair amount of the open source software available today, but I would like to see more money going into the creation of open source software, as it directly enriches all the people on this planet (money being simply a representation of all available resources, and open source being one of those resources).&lt;br /&gt;&lt;br /&gt;It strikes me that there is a gap in between the two methods of funding software outlined above. On the one hand you take a punt that lots of people need something, create it and charge for the result, and on the other hand you find one person / company that needs something and charge them a handsome sum to create it (after which you can do as you please with the result, contract permitting). Given an imaginary need such as "software for tracking individual lumps of coal", what if there are not enough companies who want to track their coal in detail to make it worth taking a punt and using the packaged software model, but equally no individual company can justify paying the extortionate rates us technical mumbo jumbo types charge for such things? Well it just won't get created, and they'll just have to carry on using illegal immigrants to write on their coal with chalk.&lt;br /&gt;&lt;br /&gt;At risk of getting to the point, we might find with the coal tracking software scenario that if we were to divide the cost of creating a coal tracker system (CTS) by the number of companies in need of such a system, then it would be a viable project. So maybe we could approach all these companies with a proposal to create a CTS (we love acronyms in IT, we even pretend to know what they mean), and get an agreement that they will jointly fund it. Okay so some won't go with it but the more that do the lower the cost per client.&lt;br /&gt;&lt;br /&gt;What has this to do with open source? I figure that seeing as open source is a better development model anyway, it makes sense to run such a project as an open source project. This way, all clients get full control and visibility over the software they have paid for, and can benefit from others' additions. The world then becomes a slightly richer place for everyone (unless it's crapware!). This plan has the added bonus that it panders to my highly unprofitable desire not to charge for things that don't involve effort or materials.&lt;br /&gt;&lt;br /&gt;There are many ways to approach getting contracts for such work (all of them hard no doubt). One could start with a single contract for the full price of the work, with the possibility of paying a lower price if more clients come on board. ie, contract one for 100% of the cost, but reduced to 60% if a second contract is found, with the second contract also paying 60%, giving a 120% income, continuing on this theme as more clients are found. Going for slightly higher than an equal division of costs gives an incentive to find more contracts and reduce the price for the original client. It might prove easier to start with say four contracts that state work and billing are dependent on finding four clients. I don't imagine for a minute this would be easy to swing, even with some of the more open minded companies out there, but I reckon all the worthwhile things in life require some effort (like flying &lt;a href="http://www.buzzflyer.co.uk/Sub-Micro-RC-Helicopters/Walkera-5-6-Genius/p-97-523/"&gt;helicopters&lt;/a&gt; of any size, for example). Perhaps with the right marketing spin it could happen, and the once it is proved to work, it might get easier to win the next contract.&lt;br /&gt;&lt;br /&gt;So if this is a successful business in the waiting, why would you want run the business as a partnership and share all that juicy profit with mere employees?! Well the inspiration for this one comes from my favourite software business writer Joel Spolsky and his explanation in his article &lt;a href="http://www.joelonsoftware.com/articles/fog0000000074.html"&gt;"Converting Capital Into Software That Works"&lt;/a&gt; that software companies' most valuable assets are the programmers. The long and short is that if programmers have financial buy in to the company they will care about the company, and if you are successful then the programmers will stick with you for the money. In fact I would go as far as taking the mission statement for such a business straight from the article, "turning capital into code".&lt;br /&gt;&lt;br /&gt;I have one last point to cover before you turn off your set, tuck the cat up in bed, post to twitter what it just did and turn out the lights.&lt;br /&gt;&lt;br /&gt;If this is such a killer business model, why on earth would I post the intellectual property (don't use this term, or &lt;a href="http://www.fsf.org/licensing/essays/not-ipr.xhtml"&gt;the FSF will get you&lt;/a&gt;), er I mean information for some smart banana to beat me to it? Simple. Successful business is one percent inspiration, ninety-nine percent perspiration, and it is the successful execution of an idea that makes or breaks a business, much more so than the original idea. In fact I'm sure many businesses start with one idea, then discover the harsh realities of commerce and up doing something else anyway. And if someone does beat me to it, it will make the software world a richer place, so I in say earnest good luck to you.&lt;br /&gt;&lt;br /&gt;The other side to releasing such information, is that I've seen what a positive effect openness has on the business of writing software, and I can see the potential positive effects for business run in an equally open fashion. Sure there are a few downsides, such as visibility for the competition, but I think as a rule they are massively overstated, and completely outweighed by the buy in and good will that you could gain from customers and potential customers from being completely open with them.&lt;br /&gt;&lt;br /&gt;I'd love to hear of any ventures in this field, and any feedback, constructive or destructive is always welcome.&lt;br /&gt;&lt;br /&gt;Thanks as always for your time. All the best from your host Tim Abell.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-611806244445315811?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/611806244445315811/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=611806244445315811' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/611806244445315811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/611806244445315811'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/11/making-money-with-free-software.html' title='Making money with free software'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2354/1860676320_0f7da3bcfb_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-2194756533997655349</id><published>2007-11-04T13:59:00.000Z</published><updated>2007-11-04T14:03:58.488Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='hosting'/><title type='text'>xsession sold out</title><content type='html'>My web host &lt;a href="http://xsession.com/"&gt;xsession&lt;/a&gt; has been bought by &lt;a href="http://www.names.co.uk/"&gt;namesco&lt;/a&gt;, and promptly put domain renewal prices up from £8 to £17. Time for a new web host.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-2194756533997655349?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/2194756533997655349/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=2194756533997655349' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2194756533997655349'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/2194756533997655349'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/11/xsession-sold-out.html' title='xsession sold out'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-9146980638736519354</id><published>2007-10-27T17:37:00.000Z</published><updated>2007-10-27T17:53:17.869Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='gnucash'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>OSS Contribution Number One!</title><content type='html'>I've had my first ever patch to an open source project accepted! Yay! (Fanfare please... no? anyone? oh well.)&lt;br /&gt;&lt;br /&gt;Ok it's a one word change to a piece of documentation, but hey it's still something.&lt;br /&gt;&lt;br /&gt;The project is &lt;a href="http://www.gnucash.org/"&gt;gnucash&lt;/a&gt;. For details take a look at &lt;a href="http://bugzilla.gnome.org/show_bug.cgi?id=490699"&gt;the bug report&lt;/a&gt; I created to hold the patch. I even got a thanks :-).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-9146980638736519354?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/9146980638736519354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=9146980638736519354' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/9146980638736519354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/9146980638736519354'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/10/oss-contribution-number-one.html' title='OSS Contribution Number One!'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-555759280771564498</id><published>2007-09-03T20:13:00.001Z</published><updated>2009-12-26T16:09:04.738Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Creating a blogroll</title><content type='html'>Update 11th Sep 2007:&lt;br /&gt;xsession responded to my support request, and the &lt;a href="http://www.timwise.co.uk/blogroll.opml"&gt;opml&lt;/a&gt; file is now served, complete with the correct mime type.&lt;br /&gt;&lt;hr/&gt;&lt;br /&gt;Update 26th Dec 2009&lt;br /&gt;Now on a linux host so no mime type issues now.&lt;br /&gt;&lt;br /&gt;Podcast list added: &lt;a href="http://www.timwise.co.uk/podcasts.opml"&gt;podcasts.opml&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now styled with custom xslt file &lt;a href="http://www.timwise.co.uk/opml.xsl"&gt;opml.xsl&lt;/a&gt;.&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;As people may want to see my rss and podcast subscriptions, I have created a blogroll for you.&lt;br /&gt;&lt;br /&gt;I've started with an &lt;a href="http://en.wikipedia.org/wiki/OPML"&gt;OPML&lt;/a&gt; file, created by hand and uploaded to my web host. Unfortunately my web host won't (currently) serve the ".opml" file extension so I've had to use .txt.&lt;br /&gt;&lt;br /&gt;so &lt;a href="http://www.timwise.co.uk/blogroll.opml"&gt;http://www.timwise.co.uk/blogroll.opml&lt;/a&gt; became &lt;a href="http://www.timwise.co.uk/blogroll.opml.txt"&gt;http://www.timwise.co.uk/blogroll.opml.txt&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I then validated the file with &lt;a href="http://validator.opml.org/"&gt;http://validator.opml.org/&lt;/a&gt;&lt;br /&gt;I then added my feed to &lt;a href="http://share.opml.org/"&gt;http://share.opml.org/&lt;/a&gt; so you can now see the list at &lt;a href="http://share.opml.org/viewsharedfeeds/?user_id=7189"&gt;http://share.opml.org/viewsharedfeeds/?user_id=7189&lt;/a&gt;&lt;br /&gt;In the opml I've separated podcasts and news feeds, but share.opml doesn't use this info.&lt;br /&gt;&lt;br /&gt;There is some &lt;a href="http://www.isolani.co.uk/blog/semanticweb/OpmlTheXmlFormatWithNoFriends"&gt;controversy&lt;/a&gt; over opml, but hell, it does the job. We can all upgrade when a better alternative goes mainstream.&lt;br /&gt;&lt;br /&gt;Useful references:&lt;br /&gt;&lt;a href="http://www.kbcafe.com/rss/?guid=20051003145153"&gt;http://www.kbcafe.com/rss/?guid=20051003145153&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.rss-tools.com/opml-generators.htm"&gt;http://www.rss-tools.com/opml-generators.htm&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bioneural.net/2005/10/09/iblog-opml-bloglines-reading-list/"&gt;http://www.bioneural.net/2005/10/09/iblog-opml-bloglines-reading-list/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://nayyeri.net/archive/2007/02/17/create-a-blogroll-from-opml-files.aspx"&gt;http://nayyeri.net/archive/2007/02/17/create-a-blogroll-from-opml-files.aspx&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-555759280771564498?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/555759280771564498/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=555759280771564498' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/555759280771564498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/555759280771564498'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/09/creating-blogroll.html' title='Creating a blogroll'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1599238885761070900</id><published>2007-08-16T21:20:00.000Z</published><updated>2007-08-16T21:42:23.978Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='asp.net'/><category scheme='http://www.blogger.com/atom/ns#' term='training'/><category scheme='http://www.blogger.com/atom/ns#' term='mcp'/><category scheme='http://www.blogger.com/atom/ns#' term='mcts'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='microsoft'/><title type='text'>Taking a Microsoft Learning course - my experience so far</title><content type='html'>I am currently studying for a Microsoft ASP.NET qualification&lt;br /&gt;&lt;a href="http://www.microsoft.com/learning/mcp/mcts/webapps/default.mspx"&gt;MCTS: .NET Framework 2.0 Web Applications&lt;/a&gt;.&lt;br /&gt;I have paid for and begun one of the Microsoft Learning training courses:&lt;br /&gt;&lt;a href="https://www.microsoftelearning.com/eLearning/offerDetail.aspx?offerPriceId=127339"&gt;Collection 5160: Core Development with the Microsoft® .NET Framework 2.0 Foundation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here are my first impressions. I have posted most of this content on the private boards of the course provider.&lt;br /&gt;&lt;br /&gt;I've been pretty pleased with the course so far. The coverage of the material seems good, and I have already learnt quite a few extra things even though I have been using ASP.NET in earnest for a couple of years commercially. The mix of presentation of content works well for me, with the video presentations, factual content, puzzles, quizzes and final lab sessions combining well to reinforce the new material.&lt;br /&gt;&lt;br /&gt;The ability to use a virtual machine at the end of each module, loaded with Visual Studio 2005 is essential for those without a copy, handy for those of us who are no longer trapped in Bill's world and a neat trick even if you do have an msdn subscription.&lt;br /&gt;&lt;br /&gt;Most of my feedback is minor annoyances. In my experience any form of education is often imperfect, and this would appear to be on the good side of such things, though it remains to be seen if it gets me through the exams!&lt;br /&gt;&lt;br /&gt;My comments:&lt;br /&gt;- Firefox support could be improved (except for activex stuff of course). I couldn't get into the course at all in firefox. (I don't atually run windows at all at home, so had to fire up a vm just to get in, even though most of the content is no more than html, css &amp;amp; flash).&lt;br /&gt;- Page width and font size seem to be linked, so if I increases the text size I have to scroll side to side, which is a PITA, as i run a super hi res screen so default text is tiny. Particularly noticeable on the lab exercise pages.&lt;br /&gt;- Providing a zip of the starter and solution files would be much better for those of us who have visual studio installed locally.&lt;br /&gt;- As someone else said, why do you have to log in to the lab machines? It's trivial to get windows to automatically log a user in.&lt;br /&gt;- I had a connection drop on me (while reading up), it would have been good to be able to reconnect to same session.&lt;br /&gt;- It would be good to see the remaining lab time in the same window as the rdp activex control.&lt;br /&gt;- The keyboard in the VM is set to US, which is a PITA as I have a UK keyboard, so " comes out as @.&lt;br /&gt;- It's not clear if the forum emails you if someone replies. I'm not likely to monitor it, but the answers I get will affect my decision to buy the rest of the courses I'm planning on doing.&lt;br /&gt;- The forums seem to be lacking in input from course staff in helping struggling (paying) students, and in providing technical support.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1599238885761070900?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1599238885761070900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1599238885761070900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1599238885761070900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1599238885761070900'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/08/taking-microsoft-learning-course-my.html' title='Taking a Microsoft Learning course - my experience so far'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-563864958843610830</id><published>2007-07-02T21:23:00.000Z</published><updated>2008-07-26T15:33:40.548Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='firefox'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Blocking web adverts</title><content type='html'>A friend asked me to write this up.&lt;br /&gt;&lt;br /&gt;To remove all those annoying adverts from the web as you see it:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;install &amp; use &lt;a href="http://www.mozilla-europe.org/en/products/firefox/"&gt;firefox&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;install &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1865"&gt;adblock plus&lt;/a&gt; add-in&lt;/li&gt;&lt;br /&gt;&lt;li&gt;install &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1136"&gt;fliterset-g updater&lt;/a&gt; add in&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Job done. Thanks for listening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-563864958843610830?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/563864958843610830/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=563864958843610830' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/563864958843610830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/563864958843610830'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/07/blocking-web-adverts.html' title='Blocking web adverts'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-6079608926457625139</id><published>2007-07-02T21:15:00.000Z</published><updated>2007-07-02T21:23:01.224Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='laptop'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu screen locking</title><content type='html'>Howto prevent ubuntu locking the screen when closing the laptop lid.&lt;br /&gt;&lt;br /&gt;Thanks to jrib in irc://freenode.net/#ubuntu for this one.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Run gconf-editor (with alt+F2)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Go to or search for /desktop/gnome/lockdown&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tick disable_lock_screen&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart gnome (ctrl+alt+backspace - after saving your documents it's a bit brutal!)&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-6079608926457625139?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/6079608926457625139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=6079608926457625139' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6079608926457625139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6079608926457625139'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/07/ubuntu-screen-locking.html' title='Ubuntu screen locking'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-1206082451587115261</id><published>2007-06-20T20:59:00.000Z</published><updated>2007-06-20T23:10:18.919Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='backup'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>backing up your home folder</title><content type='html'>Here I outline the solution I chose for backing up my life, er... I mean home folder. (I'm sure there's life outside /home/tim somewhere...)&lt;br /&gt;&lt;br /&gt;My requirements were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;backup to dvd+rw&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&amp;gt;20GB of data to back up&lt;/li&gt;&lt;br /&gt;&lt;li&gt;no obscure formats (in case I don't have the backup tool when I need to restore)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;I looked at several solutions for backups but ended up writing scripts to meet my needs.&lt;br /&gt;&lt;br /&gt;The main script creates a tar file of my home directory, excluding certain items, which is then split into files suitable for writing to dvd+rw discs, with tar based verification, md5sums and file list text files created at the same time.&lt;br /&gt;&lt;br /&gt;The reason for splitting to 3 files per disc is that the &lt;a href="http://en.wikipedia.org/wiki/ISO_9660#The_2_GiB_.28or_4.2GB_depending_on_implementation.29_file_size_limit"&gt;iso 9660&lt;/a&gt; spec has a 2GB file size limit, and it's important that the discs are as simple as possible (ie no UDF) to aid recovery in awkward situations. This is also why I avoided compression.&lt;br /&gt;&lt;br /&gt;backup_home.sh&lt;br /&gt;&lt;code&gt;#!/bin/bash -v&lt;br /&gt;#DVD+R SL capacity 4,700,372,992 bytes DVD, (see &lt;a href="http://en.wikipedia.org/wiki/DVD"&gt;wikipedia on DVD&lt;/a&gt;)&lt;br /&gt;#ISO max file size 2GB. 4.38GB/3 = 1,566,790,997bytes = 1,494MB&lt;br /&gt;#1,490MB to leave some space for listings and checksums&lt;br /&gt;tar -cvv --directory /home tim --exclude-from backup_home_exclude.txt | split -b 1490m - /var/backups/tim/home/home.tar.split.&lt;br /&gt;cd /var/backups/tim/home&lt;br /&gt;md5sum home.tar.split.* &gt; home.md5&lt;br /&gt;cat home.tar.split.* | tar -t &gt; home_file_list.txt&lt;br /&gt;cat home.tar.split.* | tar -d --directory /home tim &gt; home_diff.txt&lt;br /&gt;ls -l home.* &gt; home_backup_files.txt &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;backup_home_exclude.txt&lt;br /&gt;&lt;code&gt;tim/work*&lt;br /&gt;tim/.Trash*&lt;br /&gt;tim/.thumbnails* &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;This leaves me with a big pile of split files (named .aa, .ab etc) and a few text files. I proceeded to write 3 split files per disc, and put the 4 text files on every disc for convenience. I used gnome's built in DVD writing to create the discs.&lt;br /&gt;&lt;br /&gt;I also wanted to verify the md5 checksums as the discs were created, so I wrote another little script to make life easier. This ensures the newley written disc has been remounted properly, and runs the md5 check. So long as the 3 relevant checksums came out correctly on each disc I can be reasonably confident of recovering the data should I need it.&lt;br /&gt;"eject -t" closes the cdrom, which is handy.&lt;br /&gt;&lt;br /&gt;reload_and_verify.sh&lt;br /&gt;&lt;code&gt;#!/bin/bash -v&lt;br /&gt;cd /media&lt;br /&gt;eject&lt;br /&gt;eject -t&lt;br /&gt;mount /media/cdrom&lt;br /&gt;cd cdrom&lt;br /&gt;md5sum -c home.md5&lt;br /&gt;cd /media&lt;br /&gt;eject &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;In addition to the above mechanism (which is a pain at best, mostly due to media limitations) I keep my machines in sync with &lt;a href="http://www.cis.upenn.edu/~bcpierce/unison/"&gt;unison&lt;/a&gt; which I strongly recommend for both technical and non-technical users. I gather it also runs on microsoft (who?), so you might find it useful if you are mid transition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-1206082451587115261?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/1206082451587115261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=1206082451587115261' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1206082451587115261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/1206082451587115261'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/06/backing-up-your-home-folder.html' title='backing up your home folder'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-5927976670841268452</id><published>2007-05-28T02:18:00.001Z</published><updated>2007-05-28T02:22:00.450Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='mum'/><category scheme='http://www.blogger.com/atom/ns#' term='ceramics'/><title type='text'>My mum and her super ceramics</title><content type='html'>&lt;style type="text/css"&gt;.flickr-photo { }.flickr-frame { float: left; text-align: center; margin-right: 15px; margin-bottom: 15px; }.flickr-caption { font-size: 0.8em; margin-top: 0px; }&lt;/style&gt;&lt;div class="flickr-frame"&gt; &lt;a href="http://www.flickr.com/photos/sarah_abell/516198134/" title="photo sharing"&gt;&lt;img src="http://farm1.static.flickr.com/252/516198134_4f3854a2d4_t.jpg" class="flickr-photo" alt="Thrown Handled Vase" /&gt;&lt;/a&gt;&lt;br /&gt; &lt;span class="flickr-caption"&gt;  &lt;a href="http://www.flickr.com/photos/sarah_abell/516198134/"&gt;Thrown Handled Vase&lt;/a&gt;,&lt;br /&gt; originally uploaded by &lt;a href="http://www.flickr.com/people/sarah_abell/"&gt;Sarah Abell&lt;/a&gt;. &lt;/span&gt;&lt;/div&gt;My mum has started posting pics of her fab ceramics work on flickr. Go mum!&lt;br /&gt;&lt;br /&gt;One of her early pieces has pride of place in my display cabinet and is admired by all. Watch this space for more funky designs as she heads towards the end of uni.&lt;br clear="all" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-5927976670841268452?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/5927976670841268452/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=5927976670841268452' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5927976670841268452'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5927976670841268452'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/05/my-mum-and-her-super-ceramics.html' title='My mum and her super ceramics'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/252/516198134_4f3854a2d4_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-5421384601534929039</id><published>2007-05-27T17:35:00.000Z</published><updated>2007-05-27T17:50:34.011Z</updated><title type='text'>Get emailed Tim's blog and photos</title><content type='html'>Can't be bothered to check here and see if I've written anything this month? Great news! You can now have my blog entries and latest flickr photos sent to you by email thanks to the feedblitz service.&lt;br /&gt;&lt;br /&gt;You can subscribe to my blog using the email box on the bottom of the right hand menu, or by clicking &lt;a href="http://www.feedblitz.com/f/?Sub=216154"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;You can subscribe to my flickr photo feed &lt;a href="http://www.feedblitz.com/f/?Sub=216268"&gt;here&lt;/a&gt; (public photos only - you have to be my flickr contact to see photos of friends I post).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-5421384601534929039?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/5421384601534929039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=5421384601534929039' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5421384601534929039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5421384601534929039'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/05/get-emailed-tims-blog-and-photos.html' title='Get emailed Tim&apos;s blog and photos'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-3601923976003048564</id><published>2007-05-27T13:44:00.000Z</published><updated>2007-05-27T14:03:29.172Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='starfighter'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>starfighter</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://download.freshmeat.net/screenshots/46120_thumb.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 146px;" src="http://download.freshmeat.net/screenshots/46120_thumb.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;Whilst looking for backup packages on ubuntu via synaptic by searching for the word "tar", I stumbled across the package "starfighter". So I installed it. Then ran it. And played it. It's rather good fun. Ctrl to fire lasers, space to fire rockets, cursors to get around. Spend your time chasing enemy ships around the screen, and collecting bonuses / money. Has a decent sound track too.&lt;br /&gt;&lt;br /&gt;Highly recommended. I love the open source world.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$ apt-cache show starfighter&lt;br /&gt;Package: starfighter&lt;br /&gt;Priority: optional&lt;br /&gt;Section: universe/games&lt;br /&gt;Installed-Size: 368&lt;br /&gt;Maintainer: Debian Games Team &lt;pkg-games-devel@lists.alioth.debian.org&gt;&lt;br /&gt;Architecture: i386&lt;br /&gt;Version: 1.1-6&lt;br /&gt;Depends: libc6 (&gt;= 2.4-1), libgcc1 (&gt;= 1:4.1.0), libsdl-image1.2 (&gt;= 1.2.3), lib&lt;br /&gt;sdl-mixer1.2 (&gt;= 1.2.6), libsdl1.2debian (&gt;&gt; 1.2.7+1.2.8), libstdc++6 (&gt;= 4.1.0)&lt;br /&gt;, starfighter-data (= 1.1-6)&lt;br /&gt;Filename: pool/universe/s/starfighter/starfighter_1.1-6_i386.deb&lt;br /&gt;Size: 116320&lt;br /&gt;MD5sum: 959f894e78517a3411c3c2656d61b85c&lt;br /&gt;SHA1: ac7e2f458d4bd8c57056e11bb3da8609f35b528c&lt;br /&gt;SHA256: 29c9adee1ee2fb52f1d790254683579e919655ad01bb806a02a59d32abcb8d58&lt;br /&gt;Description: 2D scrolling shooter game&lt;br /&gt; After decades of war one company, who had gained powerful supplying both&lt;br /&gt; sides with weaponary, steps forwards and crushes both warring factions&lt;br /&gt; in one swift movement. Using far superior weaponary and AI craft, the&lt;br /&gt; company was completely unstoppable and now no one can stand in their&lt;br /&gt; way. Thousands began to perish under the iron fist of the company. The&lt;br /&gt; people cried out for a saviour, for someone to light this dark hour...&lt;br /&gt; and someone did.&lt;br /&gt; .&lt;br /&gt; Features of the game:&lt;br /&gt; .&lt;br /&gt;  o 26 missions over 4 star systems&lt;br /&gt;  o Primary and Secondary Weapons (including a laser cannon and a charge weapon)&lt;br /&gt;  o A weapon powerup system&lt;br /&gt;  o Wingmates&lt;br /&gt;  o Missions with Primary and Secondary Objectives&lt;br /&gt;  o A Variety of Missions (Protect, Destroy, etc)&lt;br /&gt;  o 13 different music tracks&lt;br /&gt;  o Boss battles&lt;br /&gt; .&lt;br /&gt; Homepage: &lt;a href="http://www.parallelrealities.co.uk/starfighter.php"&gt;http://www.parallelrealities.co.uk/starfighter.php&lt;/a&gt;&lt;br /&gt;Bugs: mailto:ubuntu-users@lists.ubuntu.com&lt;br /&gt;Origin: Ubuntu&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-3601923976003048564?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/3601923976003048564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=3601923976003048564' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3601923976003048564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3601923976003048564'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/05/starfighter.html' title='starfighter'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-3391820548015517010</id><published>2007-04-10T22:01:00.000Z</published><updated>2007-04-11T01:08:46.017Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='partimage'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>running partimage in batch mode</title><content type='html'>&lt;span style="font-style: italic;"&gt;A continuation of the &lt;a href="http://www.partimage.org/"&gt;partimage&lt;/a&gt; project.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As it would appear that stdout support doesn't work due the user interface making use of stdout, I have been figuring out how to make the program run in batch mode, with a little help from KDevelop.&lt;br /&gt;&lt;br /&gt;My continued findings:&lt;br /&gt;&lt;br /&gt;The help presents a fully batch mode, -B&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ ./partimage --help&lt;br /&gt;===============================================================================&lt;br /&gt;Partition Image (http://www.partimage.org/) version 0.6.5_beta4 [stable]&lt;br /&gt;---- distributed under the GPL 2 license (GNU General Public License) ----&lt;br /&gt;&lt;br /&gt;Supported file systems:....Ext2/3, Reiser3, FAT16/32, HPFS, JFS, XFS,&lt;br /&gt;                           UFS(beta), HFS(beta), NTFS(experimental)&lt;br /&gt;&lt;br /&gt;usage: partimage [options] &amp;lt;action&amp;gt; &amp;lt;device&amp;gt; &amp;lt;image_file&amp;gt;&lt;br /&gt;       partimage &amp;lt;imginfo/restmbr&amp;gt; &amp;lt;image_file&amp;gt;&lt;br /&gt;&lt;br /&gt;ex: partimage -z1 -o -d save /dev/hda12 /mnt/backup/redhat-6.2.partimg.gz&lt;br /&gt;ex: partimage restore /dev/hda13 /mnt/backup/suse-6.4.partimg&lt;br /&gt;ex: partimage restmbr /mnt/backup/debian-potato-2.2.partimg.bz2&lt;br /&gt;ex: partimage -z1 -om save /dev/hda9 /mnt/backup/win95-osr2.partimg.gz&lt;br /&gt;ex: partimage imginfo /mnt/backup/debian-potato-2.2.partimg.bz2&lt;br /&gt;ex: partimage -a/dev/hda6#/mnt/partimg#vfat -V 700 save /dev/hda12 /mnt/partimg/redhat-6.2.partimg.gz&lt;br /&gt;&lt;br /&gt;Arguments:&lt;br /&gt;* &amp;lt;action&amp;gt;:&lt;br /&gt;  - save: save the partition datas in an image file&lt;br /&gt;  - restore: restore the partition from an image file&lt;br /&gt;  - restmbr: restore a MBR of the image file to an hard disk&lt;br /&gt;  - imginfo: show informations about the image file&lt;br /&gt;* &amp;lt;device&amp;gt;: partition to save/restore (example: /dev/hda1)&lt;br /&gt;* &amp;lt;image_file&amp;gt;: file where data will be read/written. Can be very big.&lt;br /&gt;                For restore, &amp;lt;image_file&amp;gt; can have the value 'stdin'. This allows&lt;br /&gt;                for providing image files through a pipe.&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;* -z,  --compress      (image file compression level):&lt;br /&gt;  -z0, --compress=0    don't compress: very fast but very big image file&lt;br /&gt;  -z1, --compress=1    compress using gzip: fast and small image file (default)&lt;br /&gt;  -z2, --compress=2    (compress using bzip2: very slow and very small image file):&lt;br /&gt;* -c,  --nocheck       don't check the partition before saving&lt;br /&gt;* -o,  --overwrite     overwrite the existing image file without confirmation&lt;br /&gt;* -d,  --nodesc        don't ask any description for the image file&lt;br /&gt;* -V,  --volume        (split image into multiple volumes files)&lt;br /&gt;  -VX, --volume=X      create volumes with a size of X MB&lt;br /&gt;* -w,  --waitvol       wait for a confirmation after each volume change&lt;br /&gt;* -e,  --erase         erase empty blocks on restore with zero bytes&lt;br /&gt;* -m,  --allowmnt      don't fail if the partition is mounted. Dangerous !&lt;br /&gt;* -M,  --nombr         don't create a backup of the MBR (Mast Boot Record) in the image file&lt;br /&gt;* -h,  --help          show help&lt;br /&gt;* -v,  --version       show version&lt;br /&gt;* -i,  --compilinfo    show compilation options used&lt;br /&gt;* -f,  --finish        (action to do if finished successfully):&lt;br /&gt;  -f0, --finish=0      wait: don't make anything&lt;br /&gt;  -f1, --finish=1      halt (power off) the computer&lt;br /&gt;  -f2, --finish=2      reboot (restart the computer):&lt;br /&gt;  -f3, --finish=3      quit&lt;br /&gt;* -b,  --batch         batch mode: the GUI won't wait for an user action&lt;br /&gt;&lt;strong&gt;* -BX, --fully-batch=X batch mode without GUI, X is a challenge response string&lt;/strong&gt;&lt;br /&gt;* -y,  --nosync        don't synchronize the disks at the end of the operation (dangerous)&lt;br /&gt;* -sX, --server=X      give partimaged server's ip address&lt;br /&gt;* -pX, --port=X        give partimaged server's listening port&lt;br /&gt;* -g,  --debug=X       set the debug level to X (default: 1):&lt;br /&gt;* -n,  --nossl         disable SSL in network mode&lt;br /&gt;* -S,  --simulate      simulation of restoration mode&lt;br /&gt;* -aX, --automnt=X     automatic mount with X options. Read the doc for more details&lt;br /&gt;* -UX  --username=X    username to authenticate to server&lt;br /&gt;* -PX  --password=X    password for authentication of user to server&lt;br /&gt;===============================================================================&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It is not immediately obvious what &amp;quot;X is a challenge response string&amp;quot; means.&lt;br /&gt;I was able to get the program to run to a limited extend after a bit of searching the internet and trial and error with the option &amp;quot;-B x=y&amp;quot;.&lt;br /&gt;&lt;br /&gt;Having stepped through the program, it transpires that where I have put &amp;quot;x&amp;quot;, the program expects a pattern to match with the title and content of any messages that would otherwise have been shown to the user, and &amp;quot;y&amp;quot; is the pre-programmed response. This is in the &amp;quot;interface_none&amp;quot; section.&lt;br /&gt;&amp;quot;x&amp;quot; has to match the question in the form &amp;quot;message title/message content&amp;quot; and is compared using fnmatch which allows * as a wildcard (anyone got a good reference for fnmatch?).&lt;br /&gt;If the program hits a question for the user, and cannot find a matching answer in the command arguments, &amp;quot;CInterfaceNone::invalid_programmed_response()&amp;quot; fires &amp;quot;exit(8)&amp;quot; and the program dies.&lt;br /&gt;&lt;br /&gt;So far I have been running the program as a normal user, which will inevitably fail where it attempts to work with block devices / root owned files &amp;amp; folders. This produces a warning in the user interface, followed by program termination.&lt;br /&gt;&lt;br /&gt;To bypass this first &amp;quot;not root&amp;quot; warning, I successfully used this pre-programmed answer:&lt;br /&gt;./partimage -B Warning*=Continue&lt;br /&gt;Alternatively the following is more specific and also works:&lt;br /&gt;./partimage -B Warning*root*=continue&lt;br /&gt;&lt;br /&gt;I haven't figured out how to pass more than one predefined answer in batch mode.&lt;br /&gt;&lt;br /&gt;The run arguments can be set in KDevelop here:&lt;br /&gt;project &amp;gt; options &amp;gt; debugger &amp;gt; program arguments&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Side note:&lt;/em&gt;&lt;br /&gt;The program has a base class of user interface defined, and then either instantiates interface_none or interface_newt depending on command line arguments.&lt;br /&gt;&lt;br /&gt;If not using full batch mode it helps to set &amp;quot;enable separate terminal for application IO&amp;quot; in KDevelop (project &amp;gt; options &amp;gt; debugger) so that you can see the full user interface. However if the program exits then the console closes and any output is lost.&lt;br /&gt;&lt;br /&gt;As part of stepping through the code, I came across a macro, which makes the program harder to follow while debugging due to not being able to step through. So I figured out what it did, and wrote out its output C++ code in full:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://partimage.svn.sourceforge.net/viewvc/partimage/trunk/partimage/src/client/interface_none.cpp?revision=1&amp;view=markup&amp;pathrev=20#l_103"&gt;interface_none.cpp, line 103&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#define MB_2(One,Other,ONE,OTHER)       \&lt;br /&gt;int CInterfaceNone::msgBox##One##Other(char *title, char *text, ...) {  \&lt;br /&gt;char *result= lookup(title,text,&amp;quot;(unspecified)&amp;quot;);     \&lt;br /&gt;va_list al;          \&lt;br /&gt;va_start(al,text);         \&lt;br /&gt;message_only(#One &amp;quot;/&amp;quot; #Other, title, text, al, result);    \&lt;br /&gt;va_end(al);          \&lt;br /&gt;if (!strcasecmp(result,#One)) return MSGBOX_##ONE;     \&lt;br /&gt;if (!strcasecmp(result,#Other)) return MSGBOX_##OTHER;    \&lt;br /&gt;invalid_programmed_response();       \&lt;br /&gt;return 0;                                                             \&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;MB_2(Continue,Cancel,CONTINUE,CANCEL)&lt;br /&gt;MB_2(Yes,No,YES,NO)&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;my expanded version:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;//notes: have expanded out macro so I can step through it.&lt;br /&gt;int CInterfaceNone::msgBoxContinueCancel(char *title, char *text, ...) {&lt;br /&gt; char *result= lookup(title,text,&amp;quot;(unspecified)&amp;quot;);&lt;br /&gt; va_list al;          &lt;br /&gt; va_start(al,text);         &lt;br /&gt; message_only(&amp;quot;Continue&amp;quot; &amp;quot;/&amp;quot; &amp;quot;Cancel&amp;quot;, title, text, al, result);    &lt;br /&gt; va_end(al);          &lt;br /&gt; if (!strcasecmp(result,&amp;quot;Continue&amp;quot;)) return MSGBOX_CONTINUE;    &lt;br /&gt; if (!strcasecmp(result,&amp;quot;Cancel&amp;quot;)) return MSGBOX_CANCEL;    &lt;br /&gt; invalid_programmed_response();       &lt;br /&gt;return 0;                                                             &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int CInterfaceNone::msgBoxYesNo(char *title, char *text, ...) {  &lt;br /&gt; char *result= lookup(title,text,&amp;quot;(unspecified)&amp;quot;);     &lt;br /&gt; va_list al;          &lt;br /&gt; va_start(al,text);         &lt;br /&gt; message_only(&amp;quot;Yes&amp;quot; &amp;quot;/&amp;quot; &amp;quot;No&amp;quot;, title, text, al, result);    &lt;br /&gt; va_end(al);          &lt;br /&gt; if (!strcasecmp(result,&amp;quot;Yes&amp;quot;)) return MSGBOX_YES;     &lt;br /&gt; if (!strcasecmp(result,&amp;quot;No&amp;quot;)) return MSGBOX_NO;    &lt;br /&gt; invalid_programmed_response();       &lt;br /&gt; return 0;                                                             &lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;creating a ramdisk for testing.&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.vanemery.com/Linux/Ramdisk/ramdisk.html"&gt;http://www.vanemery.com/Linux/Ramdisk/ramdisk.html&lt;/a&gt;&lt;br /&gt;(I am on ubuntu 6.10 here, details may vary)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ ls -l /dev/ram*&lt;br /&gt;brw-rw---- 1 root disk 1,  0 2007-04-08 20:10 /dev/ram0&lt;br /&gt;brw-rw---- 1 root disk 1,  1 2007-04-08 20:10 /dev/ram1&lt;br /&gt;brw-rw---- 1 root disk 1, 10 2007-04-08 20:10 /dev/ram10&lt;br /&gt;brw-rw---- 1 root disk 1, 11 2007-04-08 20:10 /dev/ram11&lt;br /&gt;brw-rw---- 1 root disk 1, 12 2007-04-08 20:10 /dev/ram12&lt;br /&gt;brw-rw---- 1 root disk 1, 13 2007-04-08 20:10 /dev/ram13&lt;br /&gt;brw-rw---- 1 root disk 1, 14 2007-04-08 20:10 /dev/ram14&lt;br /&gt;brw-rw---- 1 root disk 1, 15 2007-04-08 20:10 /dev/ram15&lt;br /&gt;brw-rw---- 1 root disk 1,  2 2007-04-08 20:10 /dev/ram2&lt;br /&gt;brw-rw---- 1 root disk 1,  3 2007-04-08 20:10 /dev/ram3&lt;br /&gt;brw-rw---- 1 root disk 1,  4 2007-04-08 20:10 /dev/ram4&lt;br /&gt;brw-rw---- 1 root disk 1,  5 2007-04-08 20:10 /dev/ram5&lt;br /&gt;brw-rw---- 1 root disk 1,  6 2007-04-08 20:10 /dev/ram6&lt;br /&gt;brw-rw---- 1 root disk 1,  7 2007-04-08 20:10 /dev/ram7&lt;br /&gt;brw-rw---- 1 root disk 1,  8 2007-04-08 20:10 /dev/ram8&lt;br /&gt;brw-rw---- 1 root disk 1,  9 2007-04-08 20:10 /dev/ram9&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;create and mount test ramdisk&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# mke2fs /dev/ram0&lt;br /&gt;# mkdir /media/ram0&lt;br /&gt;# mount /dev/ram0 /media/ram0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;add a test file and unmount the disk&lt;br /&gt;&lt;pre&gt;&lt;code&gt;# echo &amp;quot;test data #1.&amp;quot; &amp;gt;&amp;gt; /media/ram0/foo.txt&lt;br /&gt;# umount /media/ram0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;the above, as a script:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;# create and mount test ramdisk&lt;br /&gt;mke2fs /dev/ram0&lt;br /&gt;if [ ! -d /media/ram0 ]; then&lt;br /&gt;    mkdir /media/ram0&lt;br /&gt;fi&lt;br /&gt;mount /dev/ram0 /media/ram0&lt;br /&gt;#add a test file and unmount the disk&lt;br /&gt;echo &amp;quot;test file.&amp;quot; &amp;gt;&amp;gt; /media/ram0/foo.txt&lt;br /&gt;date &amp;gt;&amp;gt; /media/ram0/foo.txt&lt;br /&gt;cat /media/ram0/foo.txt&lt;br /&gt;umount /media/ram0&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Create &amp;amp; run script (as root, because it (un)mounts a file system, and creates a dir in a root owned folder):&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ gedit mkram.sh&lt;br /&gt;$ chmod ug+x mkram.sh&lt;br /&gt;$ sudo ./mkram.sh&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Wierdly, partimage won't run in full batch mode without a second part to the -B switch, even if it's set up to not need to ask any questions. Supplying a  dummy &amp;quot;x=y&amp;quot; seems sufficient to fool it.&lt;br /&gt;&lt;br /&gt;Runing as root without asking for partition description works:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo ./partimage -d -B x=y save /dev/ram0 ram0.img&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Restore image to a different ramdisk and check file:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;$ sudo ./partimage -B x=y restore /dev/ram1 ram0.img.000&lt;br /&gt;$ sudo mount /dev/ram1 /media/ram1&lt;br /&gt;$ cat /media/ram1/foo.txt&lt;br /&gt;test file.&lt;br /&gt;Mon Apr  9 12:56:59 BST 2007&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Success!&lt;br /&gt;&lt;br /&gt;Script for checking file in saved partition:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;#!/bin/bash&lt;br /&gt;# mount and check restored ramdisk&lt;br /&gt;if [ ! -d /media/ram1 ]; then&lt;br /&gt;    mkdir /media/ram1&lt;br /&gt;fi&lt;br /&gt;mount /dev/ram1 /media/ram1&lt;br /&gt;cat /media/ram1/foo.txt&lt;br /&gt;umount /media/ram1&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;To debug in KDevelop as root (in ubuntu):&lt;br /&gt;alt-F2 (run)&lt;br /&gt;gksudo kdevelop&lt;br /&gt;open project... (go find existing copy)&lt;br /&gt;&lt;br /&gt;So in summary, I have made progress in understanding the ways of this useful utility, and am a step closer to making a useful contribution to the project.&lt;br /&gt;&lt;br /&gt;The rambling nature of this post reflects the way in which one begins to understand a new program. Hopefully it's not too hard to follow, or pick out the useful pieces. All feedback gratefully appreciated.&lt;br /&gt;&lt;br /&gt;Tim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-3391820548015517010?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/3391820548015517010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=3391820548015517010' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3391820548015517010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/3391820548015517010'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/04/running-partimage-in-batch-mode.html' title='running partimage in batch mode'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7355973608679429060</id><published>2007-03-30T00:36:00.000Z</published><updated>2008-07-26T15:34:20.890Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='fun'/><title type='text'>bad geek joke: the bourne shell</title><content type='html'>Here's one I made earlier (19 Oct 2006 according to my pc):&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/7463254@N02/439217204/" title="Photo Sharing"&gt;&lt;img src="http://farm1.static.flickr.com/160/439217204_a7ef9867ea_o.png" width="375" height="396" alt="bourneshell.png" /&gt;&lt;/a&gt;&lt;br /&gt;It's modified from &lt;a href="http://thebourneidentity.com/"&gt;http://thebourneidentity.com/&lt;/a&gt;, which is incidentally a film I very much like.&lt;br /&gt;&lt;br /&gt;For those who don't know, this is the bourne shell:&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Bourne_shell"&gt;http://en.wikipedia.org/wiki/Bourne_shell&lt;/a&gt;&lt;br /&gt;Which is the father of &lt;a href="http://www.gnu.org/software/bash/"&gt;BASH&lt;/a&gt; (/bin/bash, the Bourne Again SHell)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7355973608679429060?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7355973608679429060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7355973608679429060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7355973608679429060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7355973608679429060'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/bad-geek-joke-bourne-shell.html' title='bad geek joke: the bourne shell'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-5846736757234824293</id><published>2007-03-30T00:09:00.000Z</published><updated>2007-03-30T00:31:05.036Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='partimage'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>partimage + stdout, existing code</title><content type='html'>On first inspection it looks like some code already exists for writing an image to stdout (standard output).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://partimage.svn.sourceforge.net/viewvc/partimage/trunk/partimage/src/shared/image_disk.cpp?revision=1&amp;view=markup&amp;pathrev=20#l_558"&gt;image_disk.cpp, line 558&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;  if (strcmp(m_szImageFilename, "stdout"))&lt;br /&gt;    {&lt;br /&gt;      //... network output code hidden for clarity ...&lt;br /&gt;    }&lt;br /&gt;  else // it's stdout&lt;br /&gt;    {&lt;br /&gt;      m_fImageFile = stdout;&lt;br /&gt;      showDebug(1, "image will be on stdout\n");&lt;br /&gt;    }&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Unlike stdin for restore, stdout for save is not currently available in the command line options. I did do a build earlier where I enabled it (which I don't have any more due to my build problems). I managed to pipe an image to hexdump and seemed to be able to see some of the user interface info in the output.&lt;br /&gt;&lt;br /&gt;It would seem the problem with the stdout option is that even in batch mode the program outputs interface data to stdout, which then corrupts the image. &lt;br /&gt;&lt;br /&gt;I think I shall attempt to remove all the UI stuff, and make it act more like all the other unix tools. Might also try to create a reusable library out of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-5846736757234824293?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/5846736757234824293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=5846736757234824293' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5846736757234824293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5846736757234824293'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/partimage-stdout-existing-code.html' title='partimage + stdout, existing code'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-5549746669475271810</id><published>2007-03-26T23:06:00.000Z</published><updated>2007-03-26T23:32:22.663Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='partimage'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>compiling partimage</title><content type='html'>Had a problems getting partimage to compile on one of my pcs from a fresh checkout.&lt;br /&gt;&lt;code&gt;svn&amp;nbsp;co&amp;nbsp;https://partimage.svn.sourceforge.net/svnroot/partimage/trunk/partimage&amp;nbsp;partimage&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The ./autogen.sh script was failing as follows&lt;br /&gt;&lt;code&gt;tim@lap:~/projects/partimage$ ./autogen.sh&lt;br /&gt;Running "autoreconf -vif" ...&lt;br /&gt;&lt;br /&gt;autoreconf: Entering directory `.'&lt;br /&gt;autoreconf: running: autopoint --force&lt;br /&gt;autoreconf: running: aclocal -I m4 --output=aclocal.m4t&lt;br /&gt;autoreconf: `aclocal.m4' is unchanged&lt;br /&gt;autoreconf: configure.ac: tracing&lt;br /&gt;autoreconf: running: libtoolize --copy --force&lt;br /&gt;autoreconf: running: /usr/bin/autoconf --force&lt;br /&gt;autoreconf: running: /usr/bin/autoheader --force&lt;br /&gt;autoreconf: running: automake --add-missing --copy&lt;br /&gt;configure.ac: 16: required file `./[config.h].in' not found&lt;br /&gt;Makefile.am:1: AM_GNU_GETTEXT in `configure.ac' but `intl' not in SUBDIRS&lt;br /&gt;automake: Makefile.am: AM_GNU_GETTEXT in `configure.ac' but `ALL_LINGUAS' not defined&lt;br /&gt;autoreconf: automake failed with exit status: 1&lt;br /&gt;Done.&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Barked up lots of wrong trees, including looking for missing libraries, gettext config etc.&lt;br /&gt;&lt;br /&gt;Turned out to be an old version of automake.&lt;br /&gt;&lt;br /&gt;Not sure how my other pc ended up with the right version, but this pc's version was:&lt;br /&gt;&lt;code&gt;$ automake --version&lt;br /&gt;automake (GNU automake) 1.4-p6&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Installing new version (with some help from command line auto-completion):&lt;br /&gt;&lt;code&gt;$ apt-get install automake&lt;em style="color:green"&gt;[tab]&lt;/em&gt;&lt;br /&gt;automake         automake1.5      automake1.8      &lt;br /&gt;automake1.4      automake1.6      automake1.9      &lt;br /&gt;automake1.4-doc  automake1.7      automaken        &lt;br /&gt;&lt;br /&gt;$ sudo apt-get install automake1.9&lt;br /&gt;...&lt;br /&gt;$ automake --version&lt;br /&gt;automake (GNU automake) 1.9.6&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;After updating automake, the ./autogen.sh script ran, and I could then run ./configure and make successfully, and was left with a binary for partimage in src/client/&lt;br /&gt;&lt;br /&gt;Hurrah.&lt;br /&gt;&lt;br /&gt;The solution came from a post by Tibor Simko on cdsware.cern.ch:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://cdsware.cern.ch/lists/project-cdsware-users/archive/msg00694.shtml"&gt;Re: problem with autoreconf when installing from cvs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;    * From: Tibor Simko &lt;tibor.simko@xxxxxxx&gt;&lt;br /&gt;    * Subject: Re: problem with autoreconf when installing from cvs&lt;br /&gt;    * Date: Thu, 18 Jan 2007 18:12:20 +0100&lt;br /&gt;&lt;br /&gt;Hello:&lt;br /&gt;&lt;br /&gt;On Thu, 18 Jan 2007, robert forkel wrote:&lt;br /&gt;&lt;br /&gt;&gt; $ autoreconf&lt;br /&gt;&gt; Makefile.am:23: AM_GNU_GETTEXT in `configure.ac' but `intl' not in SUBDIRS&lt;br /&gt;&gt; automake: Makefile.am: AM_GNU_GETTEXT in `configure.ac' but&lt;br /&gt;&gt; ALL_LINGUAS' not defined&lt;br /&gt;&lt;br /&gt;Which version numbers of automake, autoconf, and gettext do you have?&lt;br /&gt;E.g. automake versions prior to 1.9 and gettext versions prior to 0.14&lt;br /&gt;will not work.&lt;br /&gt;&lt;br /&gt;Best regards&lt;br /&gt;--&lt;br /&gt;Tibor Simko&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-5549746669475271810?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/5549746669475271810/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=5549746669475271810' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5549746669475271810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/5549746669475271810'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/compiling-partimage.html' title='compiling partimage'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-7110396020145859598</id><published>2007-03-23T22:21:00.000Z</published><updated>2007-03-23T23:37:22.215Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='flickr photos'/><title type='text'>tim; now available with flickr pics</title><content type='html'>&lt;a href="http://www.flickr.com/photos/7463254%40N02/"&gt;me on flickr&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I've now started putting pretty photos up on flickr.&lt;br /&gt;&lt;br /&gt;here's my first pic:&lt;br /&gt;&lt;img src="http://farm1.static.flickr.com/160/431853892_7828040373_d.jpg" alt="trees" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-7110396020145859598?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/7110396020145859598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=7110396020145859598' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7110396020145859598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/7110396020145859598'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/tim-now-available-with-flickr-pics.html' title='tim; now available with flickr pics'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-40259322387808297</id><published>2007-03-16T17:09:00.000Z</published><updated>2007-03-16T17:45:55.271Z</updated><title type='text'>Multi-room music at home</title><content type='html'>me and &lt;a href="http://freshmeat.net/projects/slimserver/"&gt;slimserver&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Today, I wanted to play music/radio in more than one room, and since BBC Radio 4 was playing The Archers, that ruled out the FM/Radio 4 simple option!&lt;br /&gt;&lt;br /&gt;So, not liking to do anything the simple way, I set about searching for a way to broadcast sound to multiple rooms, preferably with a UDP/multicast type setup. Didn't manage that in the end, but have got something quite cool running.&lt;br /&gt;&lt;br /&gt;Initially came across &lt;a href="http://www.fireflymediaserver.org/"&gt;firefly&lt;/a&gt; media server, from &lt;a href="http://www.linux-magazine.com/issue/77/Firefly_Audio_Streaming.pdf"&gt;an article&lt;/a&gt; [pdf] in &lt;a href="http://www.linux-magazine.com/"&gt;linux magazine&lt;/a&gt;. Was put off by its absence from the ubuntu repositories.&lt;br /&gt;&lt;br /&gt;I have a mate with a &lt;a href="http://www.slimdevices.com/"&gt;slimdevice&lt;/a&gt;, which is an awesome device. The server side of it is available free as it is OSS, and it is in the ubuntu repo (universe). So install was trivial:&lt;br /&gt;&lt;code&gt;sudo apt-get install slimserver&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I could immediately connect with a web browser to http://localhost:9000/ and see the web interface (which is very good), and point any of my media players to http://localhost:9000/stream.mp3 and listen to the selected music. Nice. (Requires mp3 codec support to be installed. See &lt;a href="http://easyubuntu.freecontrib.org/"&gt;easyubuntu&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Two things tripped me up connecting remotely. I had already spotted "Server Settings / Security /   Allowed IP Addresses" and added my local subnet, but wasn't able to connect from another pc.&lt;br /&gt;netstat showed that the server had only bound to the local ip address:&lt;br /&gt;&lt;code&gt;$ netstat -tln&lt;br /&gt;Active Internet connections (only servers)&lt;br /&gt;Proto Recv-Q Send-Q Local Address           Foreign Address         State      &lt;br /&gt;...&lt;br /&gt;tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Through chance I knew about defaults files in ubuntu. Looking in /etc/defaults/slimserver, what do I find? Only bind to localhost. duh!&lt;br /&gt;&lt;code&gt;...&lt;br /&gt;# This limits http access to the local host.&lt;br /&gt;# Comment it out for network-wide access, or change &lt;br /&gt;# to enable a single interface.&lt;br /&gt;HTTP_ADDR=127.0.0.1&lt;br /&gt;...&lt;/code&gt;&lt;br /&gt;So, I commented out the http_addr line, and restarted the slimserver.&lt;br /&gt;&lt;code&gt;sudo /etc/init.d/slimserver restart&lt;/code&gt;&lt;br /&gt;Slim server was now listening on *:9000&lt;br /&gt;&lt;br /&gt;The other thing that tripped me up is that slimserver doesn't multicast, it maintains an independent stream &amp; playlist for each connected device. So when I connected remotely I hadn't added music to the right playlist. In the web based interface there is a drop down list to select which device's playlist you want to modify. Once I figured that out it all worked. Yay. :-)&lt;br /&gt;&lt;br /&gt;Didn't solve the original problem of playing the same audio simultaneously in multiple rooms, but it's cool nonetheless.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-40259322387808297?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/40259322387808297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=40259322387808297' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/40259322387808297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/40259322387808297'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/multi-room-music-at-home.html' title='Multi-room music at home'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5082828566240519947.post-6030191776095000293</id><published>2007-03-13T22:01:00.000Z</published><updated>2007-03-13T22:27:10.644Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='oss'/><category scheme='http://www.blogger.com/atom/ns#' term='dev'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='partimage'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Today's project - partimage enhancement</title><content type='html'>&lt;span style="font-style: italic;"&gt;me and &lt;a href="http://www.partimage.org/"&gt;partimage&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I recently reorganised the partitions on my laptop, with the help of some invaluable OSS tools.&lt;br /&gt;&lt;br /&gt;The laptop was split into OS partitions, with a data and swap partition at the end, but I'd starting running out of space. I have since made ubuntu my only OS at home, so no longer require multiple partitions.&lt;br /&gt;My partition table ended up looking something like this: &lt;span style="font-style: italic;"&gt;data | OS | more data | swap&lt;/span&gt;, and I wanted it to look like this: &lt;span style="font-style: italic;"&gt;OS &amp;amp; data | swap&lt;/span&gt;, but without having to rebuild (again).&lt;br /&gt;&lt;br /&gt;With another linux box available with bags of disc space, I did something like the following:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;from each data partition and my home folder: tar -cv datafolder | ssh otherbox "cat &gt; laptop/datafolder.tar", which gave me a tarball of all my data&lt;/li&gt;&lt;li&gt;boot into knoppix 4&lt;/li&gt;&lt;li&gt;use partimage to save os parition image into filesystem of another partition&lt;/li&gt;&lt;li&gt;scp osimage.img otherbox:laptop/&lt;/li&gt;&lt;li&gt;fdisk to set up new partitions&lt;/li&gt;&lt;li&gt;pipe the image back into partimage across the wire: ssh otherbox "cat laptop/osimage.img" | partimage .... plus some flags for batch writing to new partition&lt;/li&gt;&lt;li&gt;use parted (partition editor) to stretch partition image back up to full size of new partition.&lt;/li&gt;&lt;li&gt;fix grub with help from knoppix - hda(0,2) to hda(0,0) or something.&lt;/li&gt;&lt;li&gt;remove references to non existent partitions from fstab&lt;/li&gt;&lt;/ul&gt;Which was all great, but I feel there's a feature missing from partimage. Although it can read an image from stdin for writing to disc, it can't write an image to stdout from disc. This would have saved me some thinking and some hassle. So in the true spirit of OSS, I shall have a go at adding the functionality.&lt;br /&gt;&lt;br /&gt;So far, I have grabbed the source from sourceforge's svn server, managed to compile the source (after being confused by a misleading error message) and installed an IDE. I started with Eclipse, as I've been using it a bit recently and really like it, but figure that perhaps the C++ devs aren't likely to be java fans and maybe they would choose something else. So I've installed KDevelop, and will be having a go with that.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5082828566240519947-6030191776095000293?l=timwise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://timwise.blogspot.com/feeds/6030191776095000293/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5082828566240519947&amp;postID=6030191776095000293' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6030191776095000293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5082828566240519947/posts/default/6030191776095000293'/><link rel='alternate' type='text/html' href='http://timwise.blogspot.com/2007/03/todays-project-partimage-enhancement.html' title='Today&apos;s project - partimage enhancement'/><author><name>Tim Abell</name><uri>http://www.blogger.com/profile/18329208508756809573</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
