<?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-8595347</id><updated>2012-01-16T08:40:29.290Z</updated><category term='sl4a'/><category term='jQuery'/><category term='ant'/><category term='continuous integration'/><category term='pinax'/><category term='REST'/><category term='maths'/><category term='ESB'/><category term='development'/><category term='sourceforge'/><category term='BizTalk'/><category term='adb'/><category term='blender'/><category term='maven'/><category term='gp2x'/><category term='games'/><category term='hudson'/><category term='open source'/><category term='coverage.py'/><category term='django'/><category term='Cruise control'/><category term='SOA'/><category term='Cartoons'/><category term='Google App Engine'/><category term='SOAP'/><category term='Picasa'/><category term='WSDL'/><category term='android'/><category term='Mashup'/><category term='6.1'/><category term='python'/><category term='IBM Message Broker'/><category term='tdd'/><category term='source control'/><category term='pygame'/><category term='Message Broker'/><category term='ubuntu'/><category term='A2B'/><category term='virtualenv'/><category term='c++'/><category term='Google docs'/><category term='Cloud'/><category term='svn'/><category term='kids'/><title type='text'>Flight of the Integrator</title><subtitle type='html'>This is my personal blog related to the integration challenges I face in my day to day work.  With a smattering of my other interests such as drawing cartoons.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>20</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8595347.post-8924983585319736348</id><published>2011-12-23T16:34:00.001Z</published><updated>2012-01-16T08:40:29.297Z</updated><title type='text'>I wrote a Novel!</title><content type='html'>During the month of November I took part in a novel writing competition called&amp;nbsp;&lt;a href="http://www.nanowrimo.org/"&gt;www.nanowrimo.org&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Basically the idea is to write a 50,000 word novel in 30 days.&lt;br /&gt;&lt;br /&gt;Well I did it and completed the 50,000 words in the time limit, but I hadn't finished the story. &amp;nbsp;I carried on into December and today I finally finished my story. &amp;nbsp;It's a very rough first draft but I have decided to post the first 3 chapters here for people to read to see if it gathers any interest.&lt;br /&gt;&lt;br /&gt;Hope you enjoy it.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-w_YD9CG73NA/TxPibEGhNqI/AAAAAAAADW0/fZkShyvawMc/s1600/pause+a5+front.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-w_YD9CG73NA/TxPibEGhNqI/AAAAAAAADW0/fZkShyvawMc/s320/pause+a5+front.png" width="223" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-8924983585319736348?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/8924983585319736348/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=8924983585319736348' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/8924983585319736348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/8924983585319736348'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/12/i-wrote-novel.html' title='I wrote a Novel!'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-w_YD9CG73NA/TxPibEGhNqI/AAAAAAAADW0/fZkShyvawMc/s72-c/pause+a5+front.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-4405638675738955066</id><published>2011-12-23T16:27:00.003Z</published><updated>2012-01-09T08:49:36.358Z</updated><title type='text'>Pause - Chapter 3</title><content type='html'>&lt;br /&gt;&lt;h2 class="western" style="page-break-before: always;"&gt;Corporation&lt;/h2&gt;&lt;div class="western"&gt;&lt;span style="color: black;"&gt;SebastianParkington-Bowles stood proudly gazing over the river Thames throughthe tinted glass of his penthouse office suite.  Designer glassesperched on the bridge of his nose, with decorative writing stencilledon the arms.  It may of well have said "successful" onthem, such was his demeanour.  &lt;/span&gt;&lt;/div&gt;&lt;div class="western"&gt;He was looking down over London at his current andprospective customers.  There were buildings as far as the eye couldsee in every direction.  From the exclusive riverside apartments ofChelsea in the West to the shoe box "down town Beirut"tower blocks of the East end.  Each and every one housed potentialincome for his corporation.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Sebastian was a trim 45 year old, kept himself ingood shape with a personal trainer, Trudy.  He was not quite winningthe battle of the middle aged spread but you had to "oil thewheels of business" with those long exuberant lunches at theGentleman's clubs the city offered. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Tanned from his regular visits to one of his manyvillas or his yacht.  Hairline slightly receding with a bit of awidows peak and "distinguished" greying of the temples.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The young girls in the office still flirted withhim at whatever opportunity they had so he must still be a goodlooking guy.  Sadly he was unaware that most of the girls feared somuch for their jobs that it was literally an unwritten contract forfawn over the CEO and pamper his ego.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Clinicál was Sebastian's company, a cosmeticscorporation whose slogan was "Because we care".  Theyspecialised in health and skincare products for the more affluentmarket sector.  Sebastian lovingly referred to his customers as the"leather handbags" whose skin was already so knackered andprobably riddled with skin cancer from spending six months every yearin the Med and the remainder under their private sunbeds.  He oftenjoked that they would have as much luck reviving their wrinkled,saggy skin with sandpaper and a blowtorch as to use any of Clincál'sproduct offerings.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Because we care" didn't really careabout the customers, it was "Because we care - about makingobscene amounts of money".  It was "Because we care - aboutpushing our share price into the stratosphere".  It was "Becausewe care - f*ck all about our customers".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Sebastian was the youngest of twins by 5 minutes. "Always second in life Seb...", his more successful, betterlooking, younger looking, more popular brother Rupert regularlyreminded him.  Throughout his childhood Sebastian had tried to betterhis brother and failed on every occasion.  Rupert was the school Headboy, captain of the rugger team, crowned most successful student, hadthe fittest girlfriends.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;What really galled Sebastian the most was thatRupert was clearly also his father's favourite son.  He craved theattention and acknowledgement of his father.  He would walk over hotcoals just for the phrase "well done Seb" to pass hisfather's lips.  But these words had never been delivered.  To anoutside observer people would consider him a very successfulbusinessman.  However deep in his heart he was looking for a smallpiece of recognition.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;His father, Sir Bernard Parkington-Bowles, wasalso a VERY successful businessman, an international oil magnatewhose business dealt with volumes of cash that could consume Clinicálin a heartbeat.  Yes he had even received a knighthood for hisbusiness endeavours for the British import/export market.  How couldSebastian possibly compete with that?  Sir Bernard's job took him ona endless cycle of business travel where his feet barely touchedBritish soil.  Leaving mother at home to tend Parkington Hall inSurrey, with the servants.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Meanwhile Rupert ran his own media/productioncompany spanning, TV, film, music and games.  He didn't appear toever be that busy.  His life was just a merry-go-round of hob-nobbingwith the rich and famous.  The more hectic his party lifestyle themore business he drummed up for the company.  Never a week went bywithout him gracing the gossip pages of the tabloids, TV interviews,chat shows, awards ceremonies.  Sebastian found it infuriating thatthe less Rupert worked the more successful he became.  This weekscrowning glories were Rupert being voted "Britain's mosteligible bachelor", entering the top 100 rich list and Cosmo's"who would you most like to shag if stuck in a lift?" poll.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Sebastian's concentration was suddenly broken by agentle ringing sound from the P.W.I. on the office wall.  The P.W.I.was his "Personal Wealth Indicator" a hand crafted mahoganydevice that was very similar to the sliding scoreboards used insnooker halls.  However the P.W.I. Was fitted vertically with 3 railson it.  On each rail was a beautifully carved letter in ornate font. A "B", "S" and "R" to represent each oftheir personal fortunes.  Sir Bernard's "B" was teeteringas the top of the rail near the billion pound marker.  Rupert's "R"was halfway up the wall at the five hundred million mark.  WhereasSebastian's "S" was only at a modest three hundred andfifty million.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The P.W.I had been designed to fit into thesurrounding décor of the mahogany panelled office, which wouldn'tlook out of place in the hallowed halls of Oxbridge.  The onlydistraction to the panelling was the completely glass outer wall withits panoramic view of the city. It had an old money meets new moneyfeel about it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The ringing sound was made by a small brass bellat the top of the P.W.I. this ringing was to signify that thepersonal fortunes of one of the three Parkington-Bowles had altered. Behind all of this traditional grandeur was a complex mathematicalmodel for assessing their personal worth.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;In the bowels of the Clinicál head office was theI.T. Department.  Within it's racks upon racks of hardware was a loneserver.  The server had been labelled with the name "Providence"which was a geeky joke referring to the "All seeing eye ofProvidence".  Sebastian had commissioned a number of his bestsoftware engineers to developer the EOP system.  The software wasconstantly monitoring the personal fortunes of the Parkington-Bowles. It derived their wealth based upon company share prices, privateinvestments, property assets and stock market analysts forecasts oftheir businesses.  The three men shared the same broker andaccountant for their financial affairs and both were amenable to theoccasional bride.  Therefore the software engineers had implementedsome simple "read only" gateways into the broker's andaccountant's I.T. Systems to periodically glean the latest figures.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Sebastian's share trading fortunes had been aboutas successful as his other endeavours.  "Never catch a fallingknife" his financial advisor would suggest.  Unfortunatelywhenever Sebastian invested in a rising share he often became theknife thrower.  Repeatedly purchasing shares in his portfolioimmediately prior to their price tanking.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Ironically this whole exercise had been at greatexpense and shaved a couple more million off his personal worth onlyto discover that he was trailing far behind the others.  Not to bediscouraged Sebastian looked up the P.W.I. as his motivation to driveforward his company and therefore outstrip his brothers successes.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Clincál's products were as old as its rapidlydiminishing customer base, the "leather handbags" wouldn'tlive forever.  They had to do something New and Bold to turn thefortunes of the company around.  Establishing new market sectors andinventing new products.  The door to door sales of the 70's was far,far behind them now.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;They had engaged in the services of a managementconsultancy called "Schaft&lt;span style="font-family: 'Times New Roman', serif;"&gt;é&lt;/span&gt;&lt;span style="font-family: 'Times New Roman', serif;"&gt;"(lovingly referred to as "Shafters") &lt;/span&gt; that hadcaused the letter "S" to gravitate nearer the floor.  Buttheir general advice was sound.  (Probably no better or worse thanyou would get chatting to your mates in the pub, but considerablymore expensive and therefore far more "qualified").  "Youneed to speculate to accumulate!".  "Hire the brightestminds and protect your inventions with patents!".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;This "seminal" advice invoked arecruitment drive of scientists, lawyers and all the associated adminbaggage to keep the former, happy, honest and legal.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Because we care – about the future" was scribbled on whiteboards around the office.  Printed onre-branded stationary and regurgitated at shareholder meetings.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Clinicál was reinventing itself to become a verydifferent company indeed.&lt;/div&gt;&lt;div class="western"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2 class="western"&gt;&lt;/h2&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-4405638675738955066?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/4405638675738955066/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=4405638675738955066' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/4405638675738955066'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/4405638675738955066'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/12/pause-chapter-3.html' title='Pause - Chapter 3'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1557592768314412198</id><published>2011-12-23T16:26:00.000Z</published><updated>2012-01-09T08:48:44.518Z</updated><title type='text'>Pause - Chapter 2</title><content type='html'>&lt;br /&gt;&lt;h2 class="western" style="page-break-before: always;"&gt;Rebound&lt;/h2&gt;&lt;div class="western"&gt;Over the next few daysthe truth about George slowly unravelled.  He did unfortunately meethis demise and it was down to his impeccable punctuality.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Sunday afternoon 3pmGeorge had agreed to service the church clock.  With 3pm being theoptimum time to access to clock movement mechanism and adjust thehands of the clock to be precisely the right time.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;At approximately 3:05pmthe church bell ringing group had arranged an impromptu bell ringingsession, after being kicked out of the local pub due to early closingon a Sunday afternoon.  As they began their rowdy practice sessionthey were oblivious to George staggering about in the tower clutchinghis ears in agony.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;George was struck fullin the face with the largest of the bells and hurtled down the clocktower. He somersaulted backwards hands still over his ears like aRussian circus performer exercising a back flip.  His body finallycame to rest impaled on the B flat pipe of the church organ.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;From that day onceremonies at the church would have to endure the occasional dull"futt" note in their hymns, due to the bent pipe.  Thecongregation agreed to keep the pipe as it was as an eternal reminderof their beloved George.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Cynthia stopped makingnoises like an approaching police car and returned to her motherlyself.  Digging deep in her emotional reserves and taking fullresponsibility for keeping the family together.&lt;/div&gt;&lt;div class="western"&gt;She took over runningthe shop and resurrected the jewellery side of the business and alsocombined it with sewing and knitting.  A somewhat unique combinationof retail outfits that happened to suit her more creative side.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The shop made enoughincome to keep a roof over their heads and food on the table.  Thepremises were already paid for after George had studiously savedmoney over the years and bought the lease outright from the landlord.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Jake disappeared tocollege to study, Business Studies, Economics and Psychology.  Takinga large slice of his fathers savings with him for "importantbooks and stuff". &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;People still returnedto the shop with things that needed fixing.  Some out of habit and areason to reminisce with Cynthia, some out of unawareness that Georgehad died.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil had noticed thatmore and more people were bringing computers into the shop. Most ofthe "problems" people were having with these were notfaults with the devices themselves but the fact that the peopledidn't really know what they were doing.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil discussed with hismother the opportunity to lend a hand in the shop on evenings andweekends for a bit of extra pocket money.  He also selflessly offeredthis to give his poor mother a break from the 14 hour days.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil already had a goodrapport with a lot of the established customers, knowing him as"George's son" or "George's lad".  He had a skillwith being comfortable using computers but also being able to explainclearly and concisely to others how to use them.  The customers didnot find him a "smart Alec" of "condescending littleshit" as many of the computer boffins were represented in themedia.  He was just a bright helpful lad who pointed them in theright direction without making them feel like complete luddites.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;And so this was howover the next few years George's jeweller's and general repair shopmorphed into Phil's computer shop.  Following in his father'sfootsteps he became the reliable figure who could be counted on.  Heregularly overhead conversations in the local shops and pubs stating,"yeah Phil'll fix it".  Which he adopted as the name forthe shop.  "Phil'll fix-it - Computers" was emblazoned onthe front in neon day-glo orange.  Artistic taste not being one ofPhil's stronger qualities.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;As the popularity ofthe shop increased and Phil embraced the lucrative mail orderbusiness of the late 80's he had to expand, hiring an assistantcalled Chan.  Chan's family was originally of Chinese decent but hewas born and bred in Walthamstow.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Growing up surroundedby a Chinese speaking family had effectively made Chan practicallybi-lingual.  He was a chameleon who could lapse into either dialecteffortlessly.  When negotiating with off shore suppliers for cheapcomponents he was a god send.  Much happier to deal with a nativespeaker the discounts received could be gob-smacking.  When chasingup unpaid invoices from London based businesses he could adopt andalmost East end gangster voice.  Without verbally threatening to"send in the boys" the customers on the other end of thephone would visualise a 6 foot plus heavy who wasn't going to take nofor an answer.  A long way away from Chan's diminutive and delicatestatus.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Chan was mostcomfortable though speaking English with a Chinese twang.  Itprobably required the least effort mentally and was a half way housebetween home and work.  When answering the phone to customers"Phil'll fix-it computers" gradually deteriorated into"Felix computers" which ended up as the unofficial name ofthe company thereafter.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Chan was the mostdevout worker Phil could of dreamed of and they developed more of abest mates in business relationship than an employer / employee one. Cynthia often referred to Chan as her adopted son and regularlyinvited him upstairs for dinner as one of the family at the end ofthe working day.&lt;/div&gt;&lt;div class="western"&gt;Phil sometimes guiltilywished Chan had been his brother instead of Jake who had disappearedinto the world as a "Graduate Trainee" at a largemanagement consultancy.  Occasionally gracing the family table atChristmas to regale them with details of his working the way up thecorporate ladder at the expense of unsuspecting businesses that hadengaged in the services of said consultancy.  Often turning up emptyhanded present-wise because his job kept him "Soooo busy!",but not leaving until he had made a sizeable dent in the contents ofthe kitchen and mini-bar.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;During the mid 90'sPhil and Chan were ready to monopolise on the onset of the internetas a business model, being involved right from it's infancy.  They'dalready ridden the wave of the bulletin boards of the late 80's. Made a tidy sum selling modem's and IBM compatible PC's toenthusiasts and small businesses.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Having alreadycomputerised their whole operation internally it was not a majorprogramming effort to set up their own e-commerce store touting theircomputer wares and services to a broader audience.  Life was good,business was thriving and Phil and Chan had a world of opportunity inthe palm of their hands.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Meanwhile Jake had quithis job at the management consultancy to form his own internetstart-up.  He tried to persuade Phil to get involved as the venturecapitalists were "virtually throwing money" at him.  HadJake had a more sensible idea than an "internet based bookshop", Phil might've been more inclined to get involved.  He hadinherited his father's cautious gene that warned him if something wastoo good to be true it probably was.  Plus, anything to do with Jakewas generally a disaster and he was loathed to get involved.  Jake onthe other hand threw himself into the venture with abandon. Re-mortgaging his house to way beyond its market value and playingzero percent roulette with a wallet full of credit cards.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Unsurprisingly Jake'sstart-up rapidly burnt through the venture capitalist's money andJake's own  cash too.  Foosball tables, Frappacino machines, andpastel coloured break out areas didn't come cheap.  Neither didpremium rate contract hired developers whose coding skills we so indemand that they could happily renegotiate their hourly rate on adaily basis.  In terms of ruthlessness the developers made Jakeappear almost Mother Theresa like.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;With hindsight Jake's"internet bookshop" idea was probably brilliant afterallAmazon did finally turn a profit and ended up a world conqueringbusiness.  The main flaw in Jakes idea was that his developers werebuilding a fully 3D immersive bookshop experience in a browser.  Forcustomers to stroll around Jakes store and browse the shelves.  20years later and the technology might of been feasible.  Sadly in themid 90's an Internet Explorer 3.0 machine would just about render thecover of a book and the contents page before the phone connectiondropped.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The developers dressedup their code with sufficient smoke and mirrors to keep Jake enthusedlong enough till the money ran out.  Then they all hopped onto thenext dot.com bubble like a character in an arcade game.  Leaving Jakejobless, penniless, homeless and shortly afterwards wife-less.&lt;/div&gt;&lt;div class="western"&gt;For a short while Jakehad to swallow his pride and return home, shacking up in his oldbedroom that his mother had dutifully maintained for this veryoccasion.  Phil had contain his smugness each morning as he passedhis brothers old bedroom on his way to work.  The sight of a fullygrown man barely snuggled beneath a "Roy of the Rovers"duvet cover being flanked by a squadron of air-fix kit aircraft washilarious.  "Oh how the mighty have fallen" Phil thought tohimself with a wry smile.&lt;/div&gt;&lt;div class="western"&gt;But soon Jake was backon his feet "chasing the dream" and profiting off of otherpeoples suffering.  "Bubble-Burster's" was his brainchild,a support group (consultancy) to help the poor unfortunates overcomethe stresses and strains of the dot.com boom and bust.  A noblepursuit from someone who "had been there, man" like agrizzled post war veteran.   Predictably Jake's scheme was more a wayof milking the gullible of any remaining assets and cash they had,but offered "free" advice on refinancing their debts to oneeasy package.  Carol Vorderman would've been proud.  Obviously thisrefinancing came with healthy back handers to Jake from the banks,and he appeared as their saviour charging in on his white horseduring their darkest hour.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;With Phil's prudentapproach to his business he continued to turn in a tidy profit yearon year.  Never over stretching himself, with no aspirations ofdeveloping the next mega corp.  He looked forwards to his strolldownstairs for another day with Chan.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Surfing the net andaccumulating random and obscure facts.  Setting each other onlinechallenges for who could discover an answer the fastest, who couldcollect the most "googlewacks".  Solving technical problemsfor customers, family and friends gave his a sense of satisfaction.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Chan used to  laugh atthe way people who were never interested in computers before hadbecome obsessively attached to the social networks.  Barely raisingtheir eyes above their smartphones to utter a few txt abbreviatedgrunts.  Was this really the communication revolution?&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil and Chan liked tothink they had "their&lt;b&gt;"&lt;/b&gt;obsession under control and used the net for far more usefulpurposes.  Like collating top 5 lists like the characters from therecord store in Hi-Fidelity.  The net was their playground but alsotheir bread and butter.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Life was good right upuntil early 2005 when Mum started becoming ill.&lt;/div&gt;&lt;h2 class="western"&gt;&lt;/h2&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1557592768314412198?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1557592768314412198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1557592768314412198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1557592768314412198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1557592768314412198'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/12/pause-chapter-2.html' title='Pause - Chapter 2'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-5688101378566077573</id><published>2011-12-23T16:25:00.001Z</published><updated>2012-01-13T15:39:45.797Z</updated><title type='text'>Pause - Chapter 1</title><content type='html'>&lt;br /&gt;&lt;h2 class="western" style="page-break-before: always;"&gt;Promise&lt;/h2&gt;&lt;div class="western"&gt;"Good night Mum, I'm gonna fix this OK?" Phil promised as he kissed his mother on the forehead to concludehis nightly vigil at the local hospital.  She was so weak it lookedlike it was almost too much effort to raise her eyelids to bid himgoodnight.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Night son, you take care of yourself, don'tworry about your old Mum" she croaked, words rasping in her drythroat.  He could see she was fighting the onset of sleep just to bepolite.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;He lifted his polar fleece from the back of thechair and put it on before leaving the ward.  His mother's words ofadvice ringing in his ears from his childhood.  "Don't forget totake your coat off inside, or you won't feel the benefit when you goout!".  His bottom lip trembled a little, thinking of the ironyof how the roles in this relationship had been cruelly reversed.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;As a child his mother, Cynthia, was a big strongwoman,  raised as a the daughter of a mechanic she was a Tom-boy as agirl and the backbone of their family unit.  She lived for herfamily, held down numerous jobs to provide for him and his olderbrother Jake.  She vigorously upheld family values and shaped theirfamily into a close knit unstoppable force to be reckoned with.  Noone crossed the  Jones' without her knowing about it.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Everything that went on in that household was thebusiness of the whole family.  They all went to school plays,graduations, swimming galas, sports days, parties, funerals andsometimes even doctors appointments.  She felt that family life wasabout sharing the highs and lows and becoming stronger from it. Little did she know that she would end up laying dying in a secondrate NHS hospital with hardly any visitors.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Jake's career took him overseas as a motivationalspeaker on the effects of positive thinking.  He was so committed tohis work on "positivity" that he had left behind acollapsed marriage and three dysfunctional children.  Such was thepower of "positive thought" that he really didn't give ashit about anyone else and had grown up into such a selfish git thathe couldn't be arsed to visit or even phone his ailing mother duringher initial sickness.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Cynthia would be devastated to see the trail ofdamage and bullshit he was haemorrhaging around the globe.  A longway away from the two boys she brought up so lovingly.  Rubbing Vickon their chests when they had a nasty cold and putting on a paraffinnight light if it was particularly bad.  Getting up an hour beforethem so their breakfast and clothes were ready and waiting.  Jake andPhil skipping to school thinking they were glowing like a couple ofReady Brek kids with their stomachs full of porridge.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;This was not to say that the boy's father wasabsent in the family, like Cynthia, her late husband George had beenjust as firmly committed to his family.  He worked tirelessly as ajeweller and they lived above his humble shop in Walthamstow. Unfortunately the neighbourhood was not affluent enough to sustain ajewellery business alone so George decided to expand his businessinto watch and clock repairs, at which he was particularly adept. The repair business completely subsumed the jewellery trade so thatin the end George was known as "Mr Fix-it" and could turnhis hand to the repair of most mechanical and electrical householditems.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil fondly remembered peering over his father'swork bench to see a multitude of disassembled devices, incredulousthat his father could meticulously reassemble the parts back into afully functioning device.  George taught Phil how to pragmaticallytackle problems of devices he never understood, decomposing it tosimple manageable parts so that anything seemed achievable. Isolating the failed components via a series of logical deductions. George was Phil's hero and inspiration.  Sadly Jake did not followPhil's enthusiasm in his father's business.  Much happier burningthrough the profits of his father's labours in college funds,university grants, house purchases and failed business ventures. Where Phil saw a fountain of knowledge and wonderment, Jake saw abadly attended open wallet ripe for the picking.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil inherited his dad's logical prowess andthirst for understanding how things work when he was presented withhis first home computer in 1982 at the age of 12.  George's eyesightwas beginning to fail due to a lifetime behind his jeweller'smonocle, and with the early onset of Parkinsons his hands hadoccasional shakes too.  However he regularly spent a Sunday eveningwith Phil reading out program listings from a magazine as Phil'syounger nimbler fingers keyed them in.  Often spotting the typo'swell before his young son.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Between them grew a love for computers, but Georgesadly had to admit defeat of the modern miracles only because hisbody was gradually failing him.  Providing him no longer with thephysical and mental dexterity he had as a younger man.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Jakes love a computers only transpired as far asendlessly playing computer games, monopolising the family televisionset and making a tidy profit circulating pirate copies of games inthe school playground.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Then one Sunday afternoon Phil was waiting for hisfather's slow heavy footsteps on the stairs to announce the onset ofanother father / son programming session.  Normally this was theirspecial shared time, the only day of the week that the shopdownstairs was closed.  All other chores and homework were out of theway.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;He looked at the clock, it was 4pm.  As a clockrepairer/maker George's punctuality was exceptional.  He was neverlate for anything.  &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The clock on the mantelpiece seemed to tick louderand slower than ever.  It was late autumn and dusk was beginning tosettle outside casting long dark shadows through the net curtains. Phil had the computer plugged into the TV and the magazine foldedcrisply at the page ready for typing.  His dad hated it when hestarted without him because he said he struggled to follow the flowof the logic unless he was involved from the start.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Jake was in his bedroom blasting out the top ofthe pops chart countdown whilst simultaneously recording it on hiscassette recorder.  No doubt he would try and flog off a few copiesof the chart hits to unsuspecting punters at school by sneakilycutting the recordings short before the DJ's spoke.&lt;/div&gt;&lt;div class="western"&gt;4:10 pm still no sign, Phil was feelinguncomfortable and a little anxious.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;4:30 pm the phone rang and he heard his Mumanswering it in the hallway.  He could hear her muffled voice, aseries of polite "yes", "OK", "ah-ha's"followed by a timid "thanks for letting me know".  Then aclunk as she dropped the phone on the floor.  Followed by adisturbing, sliding, crumpling, collapsing thud of his motherfeinting and tumbling from her hallway phone seat.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Phil rushed into the hallway confronted by thesight of his mother spread eagled and unconscious.  The "drrrrrr"tone of the dead phone ringing in his ears.  Strangely the firstthing he did was return the phone to its cradle as his parents hadconstantly reminded him how important the phone was, it was not a toyand you could easily run up massive bills if you don't hang upcorrectly etc.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Finally his senses really kicked in and herealised he should be comforting his mother.  He called out to Jakefor help, but he was far too engrossed in the latest Dexy's MidnightRunners hit to be of any real use.  When he finally opened hisbedroom door after Phil's constant hammering it was to give him amouthful about spoiling the recording of this weeks number one.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Only when he spied his mothers prone body overPhil's shoulder did he reply with a slack jawed "oh, shit!".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Between them the boys managed to sit Cynthia up. Jake being the stronger older brother he lifted her from behindwhilst Phil slid her legs around.  Leaving her resting somewhatawkwardly but upright against the kitchen door.  The colour began toreturn to her cheeks, her eyelids fluttered and slowly she came to,as Phil held her hand nervously.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Are you OK Mum?" asked Philtentatively, "Can we get you a glass of water or something?"&lt;/div&gt;&lt;div class="western"&gt;"You went down like a sack of spuds, Mum"Jake added jovially trying to lighten the mood.&lt;/div&gt;&lt;div class="western"&gt;But Cynthia just stared blankly towards the phonenot responding to either of her boys.  A single tear welled up in herright eye and slowly rolled down her cheek and onto the curl of hertop lip.&lt;/div&gt;&lt;div class="western"&gt;Phil looked at the tear with bemusement, hecouldn't remember the last time he had seen his Mum cry.  She nevercried, not even when their old dog died she soldiered on and dealtwith it all in a good old "stiff upper lip" fashion.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Mum...." , "...Mum?"   "whowas on the phone, what is it?" he croaked, finding it difficultto form the words in his throat, asking the question that he didn'twant to ask, didn't want to know the answer to.&lt;/div&gt;&lt;div class="western"&gt;"Mum?, Mum?" echoed Jake "c'monwere on the edge of our seats here!", that was Jake subtle as abrick, oblivious to people's feelings and emotions.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Then she began to wail, a low guttural wail,almost like an old fashioned siren approaching from over a hill. Both boys had never heard their mother make a noise like that, neverheard anyone make a noise like that.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The next few minutes were a bit of a blur.  A manfrom the local church knocked at the door, came in and took Mum intothe living room.  The boys were sent to Jake's room to listen to theradio with orange juice and a whole packet of bourbons.  Normallythis would be seem as an unbelievable treat but they just satopposite each other on the bed slightly numb.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"It's dad, isn't it?  Something has happened"queried Phil.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"You don't think he's left her do you? Done arunner with one of his customers?" joked Jake.&lt;/div&gt;&lt;div class="western"&gt;"I'm serious Jake, something is up, he'snever late, and Mum is acting weird." replied Phil. &lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"Mmmm, yeah" murmured Jake.  It wasclear that his goldfish like attention span had subsided and he wason the far more pressing task of labelling his latest C90 cassetteswith the playlist of todays charts.  Phil sat knees up on the bedcuddling them and rocking gently.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;It was then that the man from the church enteredthe room.  Phil noticed he had a tiny bit of fluff trapped in hisleft eyebrow.  He was good at noticing small details, his dad alwayscredited him on that skill.  Hearing the words "... about yourDad..." sprung his mind back into the conversation.  This fluffyeyebrowed man from the church was talking about his Dad, he wonderedif he had missed anything important.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;"... we pass on our condolences to you andyour family" the man said sombrely.&lt;/div&gt;&lt;div class="western"&gt;&lt;i&gt;"condolences" &lt;/i&gt;thoughtPhil, &lt;i&gt;"isn't that one of those big words they use whentalking about dead people?"  "&lt;/i&gt;Erm,yeah, thanks...." he politely replied.  His parents would beproud of his manners, he was a good kid, had been brought up well.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Jake busied himselfuntangling a mangled cassette from the cassette recorder and tryingto salvage the twisted tape the best he could with the aid of a HBpencil.  He had not heard a word the man had just said and all Philhad caught were his "condolences".&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;The man backed out ofthe room and replaced his hat, clearly he had removed it earlier as amark of respect to whatever had happened. Gently closing the doorbehind him after courteously conducting his civic duties.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="western"&gt;Slowly the gears meshedinto place in Phil's mind,  the planets aligned, the penny dropped,the bell rang.  It finally dawned on him that his father was dead. He was clueless to find our how? Why? When?  His brother was allconsumed in his record empire and is mother was probably still agibbering wreck.&lt;/div&gt;&lt;div class="western"&gt;With no-one else toturn to he sought solstice in the only "friend" he couldturn to.  He returned to the living room and was bathed in thefluorescent glow of the television.  The friendly prompt flashed onthe screen begged for his input.  Happy to perform whateveroperations he wished.&lt;/div&gt;&lt;div class="western"&gt;&lt;span style="font-family: 'Courier New', monospace;"&gt;"Ready?"&lt;/span&gt;&lt;/div&gt;&lt;h2 class="western"&gt;&lt;/h2&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-5688101378566077573?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/5688101378566077573/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=5688101378566077573' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/5688101378566077573'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/5688101378566077573'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/12/pause-chapter-1.html' title='Pause - Chapter 1'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-2942945764438912497</id><published>2011-07-05T23:23:00.000+01:00</published><updated>2011-07-05T23:23:52.146+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><category scheme='http://www.blogger.com/atom/ns#' term='adb'/><title type='text'>Android devices appears as "???????? no permissions" in adb</title><content type='html'>Whilst tinkering with some Android development I ran into a nasty problem on Ubuntu where "adb" didn't seem to be recognising my android devices when connecting them to my pc.&lt;br /&gt;&lt;br /&gt;I diligently followed the instructions here:-&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/guide/developing/device.html"&gt;http://developer.android.com/guide/developing/device.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My device was being "seen" but not identified.&lt;br /&gt;&lt;br /&gt;When performing an "adb devices" I was receiving:-&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: arial, 'san serif'; font-size: 14px; font-weight: bold;"&gt;???????? no permissions&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: arial, 'san serif'; font-size: 14px; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;One recommendation was to run adb as 'root' with the following commands:-&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: arial, 'san serif'; font-size: 13px;"&gt;adb kill-server&lt;br /&gt;adb start-server&lt;br /&gt;adb devices&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: arial, 'san serif'; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;But doing anything as root makes me nervous, an alternate solution that is not as well documented is to include your own username in the&amp;nbsp;&lt;span class="Apple-style-span" style="color: #007000; font-family: monospace; font-size: 13px; line-height: 13px;"&gt;/etc/udev/rules.d/51-android.rules &lt;/span&gt;file.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;SUBSYSTEM=="usb", SYSFS{idVendor}=="0b05", MODE="0666", &lt;b&gt;USER="rob"&lt;/b&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;By including the USER parameter in the file adb now happily recognises my Android tablet when its plugged in without running adb as root.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Back to the development...&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-2942945764438912497?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/2942945764438912497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=2942945764438912497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/2942945764438912497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/2942945764438912497'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/07/android-devices-appears-as-no.html' title='Android devices appears as &quot;???????? no permissions&quot; in adb'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-6336152566784780955</id><published>2011-03-11T00:49:00.000Z</published><updated>2011-03-11T00:49:45.324Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM Message Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Message Broker Maven Plugin code released</title><content type='html'>This post harks back to some work I did last year on automating builds on IBM Message Broker using Hudson.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://robbaines.blogspot.com/2010/09/message-broker-continuous-integration.html"&gt;http://robbaines.blogspot.com/2010/09/message-broker-continuous-integration.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have recently been asked if the source code is available.&lt;br /&gt;&lt;br /&gt;After a few enquiries&amp;nbsp;I got the thumbs up the release the code.&lt;br /&gt;&lt;br /&gt;Here is it:-&lt;br /&gt;&lt;a href="https://code.google.com/p/maven-rsb-wmb-plugin/source/browse/#svn%2Ftrunk%2Fmaven3%2Fdocs"&gt;https://code.google.com/p/maven-rsb-wmb-plugin/source/browse/#svn%2Ftrunk%2Fmaven3%2Fdocs&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;One&amp;nbsp;caveat is that I have had to desensitise both the code and the supporting documentation to make it available to the open source community, basically ripping out references to any company related IP.&lt;br /&gt;&lt;br /&gt;I am not currently developing on Message Broker so was doing these changes blind. &amp;nbsp;Hopefully the code is still in a functional state. &amp;nbsp;I also checked in a fairly extensive instruction doc as well.&lt;br /&gt;&lt;br /&gt;So there you go, have fun....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-6336152566784780955?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/6336152566784780955/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=6336152566784780955' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/6336152566784780955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/6336152566784780955'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/03/message-broker-maven-plugin-code.html' title='Message Broker Maven Plugin code released'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1982325365752753202</id><published>2011-03-07T10:16:00.000Z</published><updated>2011-03-07T10:16:40.534Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='kids'/><category scheme='http://www.blogger.com/atom/ns#' term='maths'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><category scheme='http://www.blogger.com/atom/ns#' term='sl4a'/><title type='text'>Python coding on the bus</title><content type='html'>I have recently acquired an android phone and discovered the android-scripting project:-&amp;nbsp;&lt;a href="http://code.google.com/p/android-scripting/"&gt;http://code.google.com/p/android-scripting/&lt;/a&gt;&amp;nbsp;&amp;nbsp;Now I'm able to crank out simple python programs even on the bus ;)&lt;br /&gt;&lt;br /&gt;The code below is for a silly app I wrote whilst trying to get my 10 year old son to learn his times tables.&lt;br /&gt;&lt;br /&gt;I wrote the bulk of it at the table whilst quizzing him. &amp;nbsp;Refining the code the following day on the bus. &amp;nbsp;It originated from the "speak.py" script provide with SL4A.&lt;br /&gt;&lt;br /&gt;He was almost in tears of laughter hearing a mobile phone swear at him but it did encourage him to practice times tables and did well in his test.&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;""" maths test - by Rob Baines"""&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;import android&lt;br /&gt;import random&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, monospace;"&gt;def yes_no_dialog(message):&lt;br /&gt;&amp;nbsp; title = 'Alert'&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp; droid.dialogCreateAlert(title, message)&lt;br /&gt;&amp;nbsp; droid.&lt;wbr&gt;&lt;/wbr&gt;dialogSetPositiveButtonText('&lt;wbr&gt;&lt;/wbr&gt;Yes')&lt;br /&gt;&amp;nbsp; droid.&lt;wbr&gt;&lt;/wbr&gt;dialogSetNegativeButtonText('&lt;wbr&gt;&lt;/wbr&gt;No')&lt;br /&gt;&amp;nbsp; droid.dialogShow()&lt;br /&gt;&amp;nbsp; response = droid.dialogGetResponse().&lt;wbr&gt;&lt;/wbr&gt;result&lt;br /&gt;&amp;nbsp; return response['which'] in ('positive')&lt;br /&gt;&lt;br /&gt;droid = android.Android()&lt;br /&gt;name = droid.getInput('what is your name?').result&lt;br /&gt;loop=True&lt;br /&gt;droid.ttsSpeak("hi " + name +" sit your arse down its time for your maths test" )&lt;br /&gt;another=True&lt;br /&gt;total_questions=0&lt;br /&gt;correct_answers=0&lt;br /&gt;while another:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num1=int(random.random()*13)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; num2=int(random.random()*13)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; answer = str(num1 * num2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; total_questions+=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; message = name +" what is "+ str(num1) + " times " + str(num2) +"?"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; droid.ttsSpeak(message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; message = "the answer is " +str(answer)+" were they right?."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; correct_answer=yes_no_dialog(&lt;wbr&gt;&lt;/wbr&gt;message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if correct_answer:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; message = "well done"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; correct_answers+=1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; message = "the answer is "+ answer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; droid.ttsSpeak(message)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; message = 'would you like another question? '&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; another=yes_no_dialog(message)&lt;br /&gt;result="you got " + str(correct_answers) + " out of " + str(total_questions)&lt;br /&gt;droid.ttsSpeak(result)&lt;br /&gt;droid.dialogGetInput('', 'press enter to end the program', '')&lt;br /&gt;alert =droid.dialogCreateAlert('bye'&lt;wbr&gt;&lt;/wbr&gt;, result)&lt;br /&gt;droid.dialogShow()&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1982325365752753202?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1982325365752753202/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1982325365752753202' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1982325365752753202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1982325365752753202'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/03/python-coding-on-bus.html' title='Python coding on the bus'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-8383848736174449218</id><published>2011-01-06T21:01:00.000Z</published><updated>2011-01-06T21:01:31.195Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='virtualenv'/><category scheme='http://www.blogger.com/atom/ns#' term='pinax'/><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='tdd'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='coverage.py'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>Continuous integration with Hudson, virtualenv, pinax/django</title><content type='html'>&lt;h1&gt;Continuous integration with Hudson, virtualenv, pinax/django  &lt;/h1&gt;&lt;div&gt;And once again I'm back on the CI bandwagon...&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have been recently working on a project at working involving Python/Django and Pinax. &amp;nbsp;However to get off on the right footing we felt it was important to get a decent CI solution in place to support test driven development (TDD) including automated unit tests and code coverage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The organisation is already a heavy user of Java and so python was something new on the table. &amp;nbsp;Hudson, Maven et al was already is use elsewhere and so to prove that python could also cut the mustard for TDD as well.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have trawled the net for a number of solutions that led me along this path:-&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://hudson-labs.org/content/python-love-story-virtualenv-and-hudson"&gt;http://hudson-labs.org/content/python-love-story-virtualenv-and-hudson&lt;/a&gt;&amp;nbsp;(This will get you started nicely)&lt;/div&gt;&lt;div&gt;&lt;a href="http://heisel.org/blog/2009/11/21/django-hudson/"&gt;http://heisel.org/blog/2009/11/21/django-hudson/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://siddhi.blogspot.com/2007/04/code-coverage-for-your-django-code.html"&gt;http://siddhi.blogspot.com/2007/04/code-coverage-for-your-django-code.html&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks to these pages and probably a few others I have achieved the complete working solution I desired.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Hopefully the notes below will help you too.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;h2&gt;Prerequisites:-  &lt;/h2&gt;&lt;div&gt;Install Hudson (instructions for Ubuntu&amp;nbsp;&lt;a href="http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+on+Ubuntu"&gt;http://wiki.hudson-ci.org/display/HUDSON/Installing+Hudson+on+Ubuntu&lt;/a&gt;&amp;nbsp;)  &lt;/div&gt;&lt;div&gt;Install virtualenv  &lt;/div&gt;&lt;div&gt;Install python 2&lt;/div&gt;&lt;div&gt;Install database (eg mysql) (if running test locally)  &lt;/div&gt;&lt;h2&gt;Assumptions  &lt;/h2&gt;Currently this guide assumes that the host system is Linux. Changes will have to be made for other platforms such as Windows.&lt;br /&gt;&lt;h2&gt;Hudson plugins  &lt;/h2&gt;&lt;div&gt;Setenv plugin (for setting environment variables) V1.1  &lt;/div&gt;Cobertura plugin (for coverage reporting) V1.0  &lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: 24px; font-weight: bold;"&gt;Configuration&lt;/span&gt;&lt;/div&gt;&lt;div&gt;Create a new Hudson job:-  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="color: red;"&gt;&lt;b&gt;(Note do not have any spaces in project name, at this creates a matching directory in the /var/lib/hudson/job/ path and spaces can affect running the python interpretor under "virtualenv")&lt;/b&gt;&lt;/span&gt;  &lt;/div&gt;&amp;nbsp;&lt;br /&gt;&lt;h3&gt;Job settings  &lt;/h3&gt;&lt;div id="pxl:" style="text-align: left;"&gt;This first section of the config describes the project and defines where to retrieve the latest source code from the source repository.&lt;/div&gt;&lt;h3&gt;Build environment  &lt;/h3&gt;&lt;div id="sjac" style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: monospace; font-size: 10px; line-height: 16px; white-space: pre;"&gt;&lt;span style="color: #007800; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;PATH&lt;/span&gt;=.env&lt;span style="color: black; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;/&lt;/span&gt;bin:&lt;span style="color: #007800; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;$PATH&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="gh2x" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="eg53" style="text-align: left;"&gt;The "setenv" plugin is used to prefix the main path used by shell scripts with ".env/bin". &amp;nbsp;The ".env" will be create in the next section of the hudson job if it does not already exist.  &lt;/div&gt;&lt;h3&gt;Build steps  &lt;/h3&gt;&lt;div id="fj0u" style="text-align: left;"&gt;The build section of the job has been split into 4 logical shell scripts. &amp;nbsp;This could easily be incorporated into one single script is have been done purely for readability and logical separation of the steps involved.&lt;/div&gt;&lt;div id="jz6_" style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="q3m9" style="text-align: left;"&gt;&lt;b&gt;Step 1: create virtual env (if it doesn't exist)&lt;/b&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;if [ -d ".env" ]; then&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo "**&amp;gt; virtualenv exists"&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;else&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;echo "**&amp;gt; creating virtualenv"&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtualenv .env&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;fi&amp;nbsp;&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;source .env/bin/activate&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;The last statement in this script "activates" the virtual environment. &amp;nbsp;This means that any python packages will be installed inside the local environment and leave the host machine unaltered.  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Step 2: install required dependencies&lt;/b&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;pip install -r &lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;/requirements/project.txt&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# add locally for now, this should be done at machine level&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;pip install MySQL-python==1.2.3&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;This script installs the required dependencies for the project. &amp;nbsp;These can be found in two files in the projects source code under the "requirements" folder.  &lt;br /&gt;&lt;div&gt;base.txt contains the base dependencies for a standard "social" pinax project. &amp;nbsp;This includes django, and all associated django applications for the pinax project.  &lt;/div&gt;&lt;div&gt;project.txt contains additional dependencies that have been discovered during the projects development. &amp;nbsp;Any new dependencies &lt;b&gt;&lt;span style="color: red;"&gt;must&lt;/span&gt;&lt;/b&gt; be added to project.txt NOT base.txt  &lt;br /&gt;&lt;br /&gt;For our project the project.txt contained the following dependencies:-&lt;br /&gt;&lt;br /&gt;coverage==3.4&lt;br /&gt;unit-test-xmlreporting==1.0.3&lt;br /&gt;&lt;br /&gt;plus other stuff unique our project.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;The virtual environment is not recreated for each build so only missing dependencies will be added by subsequent builds.  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;b&gt;Step 3: prepare local_settings.py&lt;/b&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# delete local_settings.py if it exists&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;rm&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;/local_settings.py&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# rename hudson specific file&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;mv&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;/local_settings.py.hudson&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;/local_settings.py&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;echo "local_settings.py replaced with hudson version"&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;This script "prepares" the &lt;span style="color: blue;"&gt;local_settings.py&lt;/span&gt; file with hudson specific configuration. &amp;nbsp;  &lt;br /&gt;&lt;div&gt;&lt;span style="color: blue;"&gt;local_settings.py.hudson&lt;/span&gt; is the file checked into SVN (There will be a number of &lt;span style="color: blue;"&gt;local_settings.py.XXXX&lt;/span&gt; files for different environment etc)&lt;br /&gt;Note:- &lt;span style="color: blue;"&gt;local_settings.py&lt;/span&gt; must &lt;b&gt;&lt;span style="color: red;"&gt;NEVER&lt;/span&gt;&lt;/b&gt; be checked into source control but developers are able to maintain their own local version on their development machine for their own personal settings (eg. database credentials etc)  &lt;/div&gt;&lt;div&gt;Any values defined in &lt;span style="color: blue;"&gt;settings.py&lt;/span&gt; can be overridden by values in &lt;span style="color: blue;"&gt;local_settings.py&lt;/span&gt; as it is executed at the very end of &lt;span style="color: blue;"&gt;settings.py&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The script deletes any existing local_settings.py and renames &lt;span style="background-color: white;"&gt;&lt;span style="color: blue;"&gt;local_settings.py.hudson&lt;/span&gt;&lt;/span&gt; to &lt;span style="color: blue;"&gt;local_settings.py&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;Step 4: execute tests , generate coverage reports&lt;/b&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;source .env/bin/activate&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;cd&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# delete old coverage data&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage erase&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# run tests - recording coverage&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage run --source="apps/&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;,apps/&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;" manage.py test&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&amp;nbsp;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# generate an xml coverage report&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage xml -o coverage.xml&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# generate html coverage reports&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage html -d ../../builds/${BUILD_ID}/coverage_html&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;br /&gt;This script activates the virtual environment. &amp;nbsp;  &lt;br /&gt;&lt;div&gt;Navigates to the main&amp;nbsp;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your project=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;directory where the application is located.    &lt;br /&gt;&lt;div&gt;Deletes and pre-existing coverage data.    &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# run tests - recording coverage&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage run --source="apps/&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;,apps/&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;" manage.py test&amp;nbsp;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&amp;nbsp;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;This line runs the "manage.py" python script and executes tests within the&amp;nbsp;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;and&amp;nbsp;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;application.  &lt;/div&gt;&lt;div&gt;Note:- if adding any new applications to your project this line should be amended to include the directory of the code in the --source parameter and the application name in the test parameter.  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;Normally you would use the following command:-  &lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;python manage.py test&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&amp;nbsp;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;However by replacing "python" with the "coverage" command you are able to execute the code whilst performing code coverage monitoring. &amp;nbsp;The "--source" parameter allow you to specify a comma separated list of "directories" to monitor for coverage.  &lt;/div&gt;&lt;div&gt;Warning do not include any spaces in this list. &amp;nbsp;During testing I used "apps/&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: 'Times New Roman';"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&amp;nbsp;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, apps/&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;" instead of "apps/&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;,apps/&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app2=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;" and only the&amp;nbsp;&lt;span class="Apple-style-span" style="color: blue; font-family: Arial;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;your app1=""&gt;&lt;/your&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;code was monitored.&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# generate an xml coverage report&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage xml -o coverage.xml&lt;/span&gt;&lt;/span&gt;    &lt;/div&gt;After execution the "coverage xml" generates and xml formatted report of the coverage that is compatible with cobertura plugin.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;# generate html coverage reports&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;&lt;div&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="color: blue;"&gt;coverage html -d ../../builds/${BUILD_ID}/coverage_html&lt;/span&gt;&lt;/span&gt;  &lt;/div&gt;This final statement generates some additional html formatted in a folder called "coverage_html". &amp;nbsp;I have not worked out how to make this folder visible from the hudson front end yet.  &lt;br /&gt;&lt;div&gt;The benefit of these coverage reports is that they are based upon the python syntax, whereas the cobertura reports do not deal with python comments correctly so some colour coding is wrong.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;span class="Apple-style-span" style="font-size: small; font-weight: normal;"&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;span class="Apple-style-span" style="font-size: 19px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-8383848736174449218?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/8383848736174449218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=8383848736174449218' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/8383848736174449218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/8383848736174449218'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2011/01/continuous-integration-with-hudson.html' title='Continuous integration with Hudson, virtualenv, pinax/django'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-3025603742872737081</id><published>2010-09-14T08:59:00.000+01:00</published><updated>2010-09-14T08:59:55.887+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IBM Message Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='maven'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><category scheme='http://www.blogger.com/atom/ns#' term='6.1'/><title type='text'>Message Broker - continuous integration - with Maven</title><content type='html'>And once again I'm back onto continuous integration...&lt;br /&gt;&lt;br /&gt;I wrote about this quite a while ago and got a certain distance using an ant based build and cruise control.  However due to work commitments, deadlines blah, blah, blah I never finished what I'd first started.  It was really a pet project and not part of my official role.&lt;br /&gt;&lt;br /&gt;Fast forward 12 something months and I'm tasked with the same challenge again but this time for real.  Therefore I can spend real time on the solution rather than noodling about on my PC on the train.&lt;br /&gt;&lt;br /&gt;However this time there is a new kid on the block called "maven" &lt;a href="http://maven.apache.org/"&gt;http://maven.apache.org/&lt;/a&gt;.  (Actually not really that new but as a corporation we have adopted it as a "standard" build tool.&lt;br /&gt;&lt;br /&gt;Therefore the previous work I did is kinda irrelevant but the principals the same.&lt;br /&gt;&lt;br /&gt;There are plenty of sites providing tutorials on maven that go way beyond the realms of my knowledge.  The important factors to get IBM Websphere Message Broker playing nicely with maven are the plug-ins.  Note all this work has been done on version 6.1 of the Broker.&lt;br /&gt;&lt;br /&gt;There are already a couple of plugins kicking about in the open source community that I tried to use but didn't work (for me).  They did world on simple projects but when getting into multi project dependencies etc they didn't quite cut the mustard.&lt;br /&gt;&lt;br /&gt;As part of my solution I developed 3 separate plugins to wrap existing broker commands.  Allowing them to be invoked as part of the build process.&lt;br /&gt;&lt;br /&gt;mqsicreatebar&lt;br /&gt;mqsideploy&lt;br /&gt;mqsiapplybaroverride&lt;br /&gt;&lt;br /&gt;For know I'll talk about the first one.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;mqsicreatebar&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Uses the maven pom.xml file to pass parameters to the plugin.  This plugin will create a empty eclipse workspace for building and then only add the required projects to the workspace.  Seasoned broker developers will know the joys of working with the eclipse toolset and watching their life waste away watching the "rebuilding workspace" message.&lt;br /&gt;&lt;br /&gt;To code looks at the main .project file and drills down through any child project files collecting project references to include in the build.  &lt;br /&gt;&lt;br /&gt;These references are collated for form parameters for the mqsicreatebar command.  The code also collects references to .jar, .outadapter, .mset files also required to successfully deploy the message flow.&lt;br /&gt;(Note the code only includes .outadapter files because we are only using SAP outbound adapters, it could easily include .inadapter files to I guess.)&lt;br /&gt;&lt;br /&gt;The end result of a successful build should be a .bar file containing a single controlling message flow, with all its associated .jar, .mset, adapter files.  Meaning that there are no other dependencies to deploy this message flow.&lt;br /&gt;&lt;br /&gt;Now wouldn't it be perfect if everything "always" worked that easily.  Until you get some rogue developer who breaks the build.  What the plugin also does it create an additional .bar file after compilation containing all the source code of the referenced projects.  So if your project does fail to build you can unpack the bar file and import it into an EMPTY workspace and try and compile it manually.&lt;br /&gt;&lt;br /&gt;The toolkit should then be kind enough to pinpoint who's broken the code and must buy all the doughnuts.  (&lt;-- notice the British spelling ;)  )&lt;br /&gt;&lt;br /&gt;Well that is the createbar plugin basically covered.  I'll try to write up the other plugins and see it I can get approval to release the code. (Maybe minus the corporate namespaces...)&lt;br /&gt;&lt;br /&gt;There is a big push here to embrace the open source community so its time we gave something back too...&lt;br /&gt;&lt;br /&gt;Next time mqsideploy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-3025603742872737081?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/3025603742872737081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=3025603742872737081' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/3025603742872737081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/3025603742872737081'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2010/09/message-broker-continuous-integration.html' title='Message Broker - continuous integration - with Maven'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1165082822995945309</id><published>2010-02-05T21:54:00.000Z</published><updated>2010-02-05T21:54:17.608Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google App Engine'/><category scheme='http://www.blogger.com/atom/ns#' term='A2B'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><category scheme='http://www.blogger.com/atom/ns#' term='Mashup'/><title type='text'>A2B interest wanes</title><content type='html'>As expected the interest I have in developing A2B is beginning to wane.&lt;br /&gt;&lt;br /&gt;I feel I have coded a near complete game which is rough around the edge but ticks all the boxes.  Rather than fester on my harddrive I have at least released the source to the community (warts and all).  If some brave soul wishes to take up the baton away they go.&lt;br /&gt;&lt;br /&gt;However my butterfly like interest has moved onto pastures new.  After spending the bulk of my professional career on system integration and "back-end" systems. I feel the need to indulge myself in a bit of client side web development.&lt;br /&gt;&lt;br /&gt;My head has been recently buried in a book on Mashup development and jQuery.  I am planning something new involving Google App Engine.  Python based site with jQuery in the client.&lt;br /&gt;&lt;br /&gt;Watch this space.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1165082822995945309?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1165082822995945309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1165082822995945309' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1165082822995945309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1165082822995945309'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2010/02/a2b-interest-wanes.html' title='A2B interest wanes'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1645316270694222209</id><published>2010-01-12T23:29:00.002Z</published><updated>2010-01-12T23:35:42.867Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='open source'/><category scheme='http://www.blogger.com/atom/ns#' term='pygame'/><category scheme='http://www.blogger.com/atom/ns#' term='A2B'/><category scheme='http://www.blogger.com/atom/ns#' term='sourceforge'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='svn'/><title type='text'>A2B goes open source</title><content type='html'>In an effort to keep the development inertia going and a toe in the water of open source development, I've set up A2B on Sourceforge as an open source project.&lt;br /&gt;&lt;br /&gt;At present I'm the only developer but it's reassuring to have an online backup of all my source code and its good experience to be working with SVN.&lt;br /&gt;&lt;br /&gt;Nicely integrated with Eclipse and a breeze to set up.  Handy instructions blogged &lt;a href="http://blog.metasimian.net/2008/12/eclipse-sourceforge-svn.html"&gt;here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The project can be found here if you're interested.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sourceforge.net/projects/a2b/"&gt;The Project&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1645316270694222209?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1645316270694222209/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1645316270694222209' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1645316270694222209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1645316270694222209'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2010/01/a2b-goes-open-source.html' title='A2B goes open source'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-7312789451725530722</id><published>2010-01-09T11:45:00.009Z</published><updated>2010-01-12T23:36:21.023Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pygame'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='A2B'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='blender'/><title type='text'>A2B Post xmas update</title><content type='html'>Development on A2B has taken a bit of a back seat lately, mainly due to the hectic nature of Xmas, work and a shiny new PSP consuming my commute time.&lt;br /&gt;&lt;br /&gt;However I will doggedly continue the development as my eldest sons continues to ask me about my progress and it would be a shame for yet another unfinished project to fall by the way side.&lt;br /&gt;&lt;br /&gt;The majority of this update was written pre-xmas, I've only just got round to updating the blog....&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;16/11/2009&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Play testing confusion&lt;/span&gt;&lt;br /&gt;After some testing of my levels I began to realise due to the brutal isometric nature of the graphics is was not always obvious where a block was.  With no visual clues such as shadows to provide some depth perception, you could only tell if a block is hovering in the air by travelling under it.  Otherwise it may well be part of the back wall graphics.&lt;br /&gt;&lt;br /&gt;I drew the original graphics in “gimp” with the intention of them appearing on the GP2X 320 x 240 display.  They were “functional” but not particularly pretty.  I felt it was time to use some additional tooling to render the graphics for me.  Therefore the obvious choice was a 3D rendering tool such as Blender.  Armed with my “Dummies Guide to Blender” (first ever for Dummies book I've purchased!)  I was away.&lt;br /&gt;&lt;br /&gt;My first challenge was to render 3D cubes that we easy to display in a pseudo 3D way.  Lets face it I'm cheating with this game, it's not “real” 3D, the blocks don't get smaller the further away.  Fortunately in Blender if you switch your camera to be “orthographic” it will render in exactly this fashion with all objects a uniform height.&lt;br /&gt;&lt;br /&gt;Below is a screen shot of the majority of artefacts I have created in Blender.  Very, very simple coloured cubes, nothing spectacular but way prettier than my hand crafted efforts.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MrxBVBsXXsE/S0hvFgei-6I/AAAAAAAAA_0/1-pb4MEI958/s1600-h/blender.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 200px;" src="http://3.bp.blogspot.com/_MrxBVBsXXsE/S0hvFgei-6I/AAAAAAAAA_0/1-pb4MEI958/s320/blender.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5424707891575847842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;After rending and saving as a JPEG I was able to crop/scale etc. to get an equivalent set of images to my original graphics.&lt;br /&gt;&lt;br /&gt;Copy the resulting images into the images folder and run the code...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MrxBVBsXXsE/S0hvXpQOF8I/AAAAAAAAA_8/RABVG05B0Nw/s1600-h/odd+graphics.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_MrxBVBsXXsE/S0hvXpQOF8I/AAAAAAAAA_8/RABVG05B0Nw/s320/odd+graphics.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5424708203169322946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Yeah gods! Close but no cigar.  The original code expects symmetrical cubes, whereas the new ones are off at a slight angle.&lt;br /&gt;&lt;br /&gt;Much head scratching, scribbling blocks on paper etc, I was able to work out a new algorithm for rendering the game board.  Basically there as xXoffset, xYOffset, yXOffset, yYOffset and lYOffset co-ords to add to each block depending on their location on the board.&lt;br /&gt;&lt;br /&gt;(Eagle eyed readers may noticed I hadn't got around to doing the start and end blocks either)&lt;br /&gt;And the end result is...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;17/11/2009&lt;br /&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MrxBVBsXXsE/S0hvnIeulcI/AAAAAAAABAE/ZQgJDqddge8/s1600-h/2009-11-17a.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_MrxBVBsXXsE/S0hvnIeulcI/AAAAAAAABAE/ZQgJDqddge8/s320/2009-11-17a.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5424708469249709506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Now you can see hovering blocks are much more obvious now.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/S0hv2ImR4pI/AAAAAAAABAM/z-Ad3zry19c/s1600-h/2009-11-17b.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/S0hv2ImR4pI/AAAAAAAABAM/z-Ad3zry19c/s320/2009-11-17b.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5424708726979420818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And overall it is much prettier than before.&lt;br /&gt;I also had to re-jig the controls.  Previously left and right would move you in and out of the board.  (Similar to Zaxxon controls for the oldies who remember)  However now the board is orientated further around the left/right controls make more sense to move you left/right across the board.  With up/down doing the in/out movement.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Next steps...&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sound? Better level designs?  Something to kill you?  A time limit?  Not sure yet but it is certainly missing all of these.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-7312789451725530722?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/7312789451725530722/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=7312789451725530722' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/7312789451725530722'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/7312789451725530722'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2010/01/a2b-post-xmas-update.html' title='A2B Post xmas update'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_MrxBVBsXXsE/S0hvFgei-6I/AAAAAAAAA_0/1-pb4MEI958/s72-c/blender.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-7554202517241048786</id><published>2009-11-17T22:18:00.008Z</published><updated>2010-01-12T23:42:13.893Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='pygame'/><category scheme='http://www.blogger.com/atom/ns#' term='games'/><category scheme='http://www.blogger.com/atom/ns#' term='gp2x'/><category scheme='http://www.blogger.com/atom/ns#' term='A2B'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>A2B Update - 6/11/2009</title><content type='html'>Thought it was about time for an update on my progress of A2B.  I am continuing to develop the game more or less every weekday.  About 2 hours a day.  One hour going to work followed by one hour coming home.&lt;br /&gt;&lt;br /&gt;I must say python is really growing on me as a language.  With the offline docs installed on my laptop for Python 2.6, Pygame and the html version of Deep Dive into Python I can be pretty self sufficient without internet access.&lt;br /&gt;&lt;br /&gt;The majority of features I have added to the game have been added fairly swiftly without too many headaches.  Surprising considering I am new to the language.  Perhaps I have made life a little easier on my self by redeveloping something I already did(started) in C++ a couple of years ago.&lt;br /&gt;&lt;br /&gt;However I feel I have reached a milestone in development for two reason:-&lt;br /&gt;&lt;br /&gt;I.)I have now surpassed the functionality that was in the original incarnation of A2B.&lt;br /&gt;II.)I haven't actually got bored along the way and given up on developing it.  I think this may be the fact that I am using the development as a distraction from my daily commute.  (The time literally flies by on the train when I am embroiled in my coding.)&lt;br /&gt;&lt;br /&gt;So now for the interesting stuff, what have I added since the previous update:-&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MrxBVBsXXsE/SwMjbEorzzI/AAAAAAAAA-w/v1YMIVUu1sI/s1600/Screenshot-A2B-2009-10-23.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_MrxBVBsXXsE/SwMjbEorzzI/AAAAAAAAA-w/v1YMIVUu1sI/s320/Screenshot-A2B-2009-10-23.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405202925782552370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;By the 23rd October I had the basic game engine loading levels from an ASCII file.  The level is broken into a number of “layers”.  Coloured blocks are represented by different characters in the file.  For example the bottom layer consists of:-&lt;br /&gt;&lt;br /&gt;bbbbbbbbbb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;byryryryrb&lt;br /&gt;bryryryryb&lt;br /&gt;bbbbbbbbbb&lt;br /&gt;&lt;br /&gt;The program parses this level file and creates a python dictionary object for each block on the game board.  Each block has an x, y and l (layer) co-ordinate.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMj5nDEXbI/AAAAAAAAA-4/dsXfRZBAKy8/s1600/Screenshot-A2B(2009-10-26).png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMj5nDEXbI/AAAAAAAAA-4/dsXfRZBAKy8/s320/Screenshot-A2B(2009-10-26).png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405203450416094642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A few days later and I have an FPS (frames per second counter) – big whoop, and if you look carefully you can see a transparent cube that displays the players current position.&lt;br /&gt;&lt;br /&gt;This cube can be moved around using the arrow keys, up, down, left and right allow the player to move around on the game board.  Pressing space enables “drag mode”, in which you can drag the green blocks about.&lt;br /&gt;&lt;br /&gt;Game Structure&lt;br /&gt;After this I concentrated on adding the overall game structure.  Not pretty but fully functional for now.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Main menu&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MrxBVBsXXsE/SwMkTcbHg3I/AAAAAAAAA_A/zimgS6z4lHU/s1600/Screenshot-A2B-main.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://2.bp.blogspot.com/_MrxBVBsXXsE/SwMkTcbHg3I/AAAAAAAAA_A/zimgS6z4lHU/s320/Screenshot-A2B-main.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405203894240772978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Start level&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMksB_uvfI/AAAAAAAAA_I/yD4tQe02Ov8/s1600/Screenshot-A2B+start.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMksB_uvfI/AAAAAAAAA_I/yD4tQe02Ov8/s320/Screenshot-A2B+start.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405204316643311090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Each level will have a name in the level file, I'll have to think up some appropriately witty names based on the level designs.&lt;br /&gt;&lt;br /&gt;And now the BIG change...&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMlDdDtJcI/AAAAAAAAA_Q/c9nWJ4ypZVk/s1600/Screenshot-A2B-level1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/SwMlDdDtJcI/AAAAAAAAA_Q/c9nWJ4ypZVk/s320/Screenshot-A2B-level1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5405204719044732354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Multiple layers of block can now be dragged around on screen based upon the player location (box).  Therefore you can drag piles of blocks around.  On the back wall you can see a number of blue blocks sticking out to for a ledge.  The blue blocks are known as “solid” and cannot be dragged around.  So if you go under the ledge with a pile of blocks the top block will not slide off.&lt;br /&gt;&lt;br /&gt;This has all been implemented as a pretty basic physics engine.  No fancy gravity simulation, rules of physic etc.  Just basic code hacked together.  So far in testing the blocks do appear to adhere to the basic rules of physics.  However these rules are applied to game objects only when they move.  Therefore if a block starts the level hovering in mid air it will not begin falling until something passes beneath it.  That is when the block falling logic kicks in.  Checking every block for every game loop would probably hammer performance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-7554202517241048786?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/7554202517241048786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=7554202517241048786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/7554202517241048786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/7554202517241048786'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/11/a2b-update-6112009.html' title='A2B Update - 6/11/2009'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_MrxBVBsXXsE/SwMjbEorzzI/AAAAAAAAA-w/v1YMIVUu1sI/s72-c/Screenshot-A2B-2009-10-23.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-890068066085490790</id><published>2009-10-21T21:19:00.011+01:00</published><updated>2010-01-12T23:42:13.894Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='pygame'/><category scheme='http://www.blogger.com/atom/ns#' term='gp2x'/><category scheme='http://www.blogger.com/atom/ns#' term='A2B'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Son of A2B</title><content type='html'>The article below is a development diary I have dusted off recently and revisted.  The original project was in C++ on the GP2X, the new incarnation will be in Python, on whatever platform supports it...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A2B – Development Diary&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Date 28/1/2007&lt;br /&gt;&lt;/span&gt;Started coding 27/1/2007.  Had an idea for an isometric puzzle type game for the GP2X I got for xmas 2006.  Haven’t coded C since around 1995, but have been coding Java and C# since, so thought I should take a stab at C++.&lt;br /&gt;&lt;br /&gt;It took a while to get a dev kit up and running that allows me to compile for Windows and GP2X.  After many frustrating evenings I finally got a config I was happy with that created executables that run on Windows and GP2X with graphics and sound.  So I have actually been coding on/off since the new year.&lt;br /&gt;&lt;br /&gt;But here is screen shot 1 of the new project.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/St9vTXKJefI/AAAAAAAAA9Q/mv-uQh9oH3A/s1600-h/A2B1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/St9vTXKJefI/AAAAAAAAA9Q/mv-uQh9oH3A/s320/A2B1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395153257037920754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I have been gradually getting new parts of code working, then tidying them up to be more object orientated.&lt;br /&gt;&lt;br /&gt;The blue blocks are all in a three dimensional array in the main Game class and are being crudely handled.  &lt;br /&gt;&lt;br /&gt;The red block is my first instance of “BlockSolid” a class for drawing blocks where I please.&lt;br /&gt;&lt;br /&gt;Hopefully the class hierarchy will evolve into something elegant.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Date 29/1/2007&lt;br /&gt;&lt;/span&gt;Not much progress visually but now the game board is a separate class containing objects for each block.&lt;br /&gt;&lt;br /&gt;Methods for drawing and movement have been refactored so each game object has a single Draw() method.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MrxBVBsXXsE/St9vvwx9JOI/AAAAAAAAA9Y/7W9xQ6GDYzw/s1600-h/A2B2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://2.bp.blogspot.com/_MrxBVBsXXsE/St9vvwx9JOI/AAAAAAAAA9Y/7W9xQ6GDYzw/s320/A2B2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395153744952108258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Lots of work for very little gain at present but should pay off in the long run when introducing new block types.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Date 15/2/2007&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;A considerable rewrite of the block classes to use static pointers for images, instead of having a pointer in every block object instance.&lt;br /&gt;&lt;br /&gt;Tied myself in knots learning the way C++ deals with static data members (pfft) Java and C# make this bit easy.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_MrxBVBsXXsE/St9v_hwiXjI/AAAAAAAAA9g/dxMzUK11CTQ/s1600-h/A2B3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://2.bp.blogspot.com/_MrxBVBsXXsE/St9v_hwiXjI/AAAAAAAAA9g/dxMzUK11CTQ/s320/A2B3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395154015797534258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Room design now being loaded from a file.  Here is a sample of the ASCII file containing the room design.&lt;br /&gt;&lt;br /&gt;Game version:1.0&lt;br /&gt;Room number:1&lt;br /&gt;Room name:A2B first room&lt;br /&gt;Room height:10&lt;br /&gt;Room width:10&lt;br /&gt;Room layers:5&lt;br /&gt;Room layer:0&lt;br /&gt;srrrrrrrrs&lt;br /&gt;rbybybybyr&lt;br /&gt;rybybybybr&lt;br /&gt;rbybybybyr&lt;br /&gt;rybybybybr&lt;br /&gt;gbybybybyr&lt;br /&gt;rybybybybr&lt;br /&gt;rbybybybyr&lt;br /&gt;rybybybybr&lt;br /&gt;srrrrrrrrs&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Date 18/2/2007&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;A productive weekends coding :-&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_MrxBVBsXXsE/St9wPnfAwoI/AAAAAAAAA9o/fDVhQoU3xWc/s1600-h/A2B4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://4.bp.blogspot.com/_MrxBVBsXXsE/St9wPnfAwoI/AAAAAAAAA9o/fDVhQoU3xWc/s320/A2B4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395154292212548226" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I decided to change the background colour scheme. On the GP2X with the white background it was often impossible to see the blocks at certain viewing angles.&lt;br /&gt;&lt;br /&gt;I have added coding for dragging the blocks around the screen now.  Grey blocks are solid blocks where the cursor cannot pass through and they cannot be dragged.&lt;br /&gt;&lt;br /&gt;Other blocks can be dragged.  If the bottom block in a stack is dragged the whole stack is moved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Date 11/3/2007&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Bit of a gap coding wise.  Been busy with other stuff.  40th birthday cartoon to draw for a friend amongst other things.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_MrxBVBsXXsE/St9wbhnFQhI/AAAAAAAAA9w/Zlkto1uLVf8/s1600-h/A2B5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 260px;" src="http://1.bp.blogspot.com/_MrxBVBsXXsE/St9wbhnFQhI/AAAAAAAAA9w/Zlkto1uLVf8/s320/A2B5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395154496794214930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Routines are now coded to check for rows of identical blocks of 3 and above being converted to “destroyed” blocks.  Also added a simple scoring mechanism.&lt;br /&gt;&lt;br /&gt;Next steps to add animation to blocks being destroyed.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To Do List (as at 20/3/2007):-&lt;br /&gt;&lt;br /&gt;Animation Class complete&lt;br /&gt;&lt;br /&gt;Code to clone animation classes&lt;br /&gt;&lt;br /&gt;Improve image loading from config script.&lt;br /&gt;&lt;br /&gt;Load rooms from filename.&lt;br /&gt;&lt;br /&gt;At end of room move to next room.&lt;br /&gt;&lt;br /&gt;At end of all rooms end game.&lt;br /&gt;&lt;br /&gt;Additional block types&lt;br /&gt;spike blocks that make you lose lives&lt;br /&gt;elevator blocks to lift blocks up/down a level&lt;br /&gt;conveyor blocks to slide blocks&lt;br /&gt;water&lt;br /&gt;fire&lt;br /&gt;&lt;br /&gt;Scoring&lt;br /&gt;Lives counter&lt;br /&gt;&lt;br /&gt;Menu system&lt;br /&gt;&lt;br /&gt;High score table&lt;br /&gt;Instructions&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;And then came the dreadful upgrade to Windows Vista...&lt;br /&gt;&lt;br /&gt;I foolishly upgraded my PC to Vista assuming that the development environment I had tirelessly set up would work seamlessly under Vista.  Sadly I was so very very wrong.  After a lot of digging it appeared that the underlying toolchain for cross compiling to an arm executable did not work with Vista's new security model.&lt;br /&gt;&lt;br /&gt;Therefore my development completely lost momentum and I yet another half finished coding project was resigned to silicon heaven.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Early October 2009&lt;br /&gt;&lt;/span&gt;Fast forward 3 years to October 2009 and I am beginning to teach myself Python.  I did “try” to learn it about a year or two ago but never quite got around to doing anything useful with it.&lt;br /&gt;&lt;br /&gt;Sat on a train for almost 4 hours a day I needed something to keep the old synapses firing.  I dusted off my Deep Dive into Python book, installed the lovely Ubuntu desktop on my laptop and off I went.  Knocking out a few bits and pieces of Python but struggling to think of “something” that would hold my interest long enough to learn the language and challenging enough to be more that a mere “hello world” effort.  Then I discovered pygame, the python based wrapper for SDL, the same SDL that my GP2X development was based upon and I had a direction.&lt;br /&gt;&lt;br /&gt;I now present you with son of A2B the Python resurrection of the same unfinished game.  Sadly I never retained any of the original code or graphics only this development diary.  Luckily I was able to crop some of the block images from the screenshots in GIMP and began coding from the ground up.&lt;br /&gt;&lt;br /&gt;I have been using the PyDev plugin for Eclipse as my IDE. I know many people feel Eclipse is a bit of a bloated dinosaur compared to other IDE, but I chose this due to familiarity, as I use this on a day to day basis to IBM message broker development.   All the usual code completion, syntax checking, debugging etc. are available.&lt;br /&gt; &lt;br /&gt;This is when I was impressed how quickly you could become productive with Python and I have the basic display working in one round trip from home/work/home.  Not bad for a Python/pygame noob.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_MrxBVBsXXsE/St9wj_gmFJI/AAAAAAAAA94/ZEnNIeIZ79A/s1600-h/A2BNew.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 239px;" src="http://3.bp.blogspot.com/_MrxBVBsXXsE/St9wj_gmFJI/AAAAAAAAA94/ZEnNIeIZ79A/s320/A2BNew.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5395154642259022994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;As you can see I opted for a larger grid than the GP2X version to give performance a decent test.  This is drawing 18x18x5 separate blocks (no optimisation) and isn't breaking a sweat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Cross Platform Portability&lt;br /&gt;&lt;/span&gt;The next thing that impressed me was the ability to stick my source code/images etc on a memory stick and just run it on a windows box.  I know Java has heralded the “write once, run anywhere” ethos, but this is not always the case and often classpaths and .jar's throw a gremlin in the works.&lt;br /&gt;&lt;br /&gt;This really did run first time off the memory stick.  I was grinning at the simplicity of it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;21/10/2009&lt;br /&gt;&lt;/span&gt;Now I am beginning to get to grips with the language I am transforming my early code into formal classes/sub classes, adding code to read levels from configuration files etc.  All pretty dull stuff for now but will pay dividends in the long run.&lt;br /&gt;&lt;br /&gt;Let's see how long this lasts....&lt;br /&gt;&lt;br /&gt;With Ubuntu 9.10 only 8 days away do I bite the bullet and upgrade or hang fire for a while.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-890068066085490790?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/890068066085490790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=890068066085490790' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/890068066085490790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/890068066085490790'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/10/son-of-a2b.html' title='Son of A2B'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_MrxBVBsXXsE/St9vTXKJefI/AAAAAAAAA9Q/mv-uQh9oH3A/s72-c/A2B1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1243482600487376872</id><published>2009-07-26T22:31:00.002+01:00</published><updated>2009-07-26T23:11:33.429+01:00</updated><title type='text'>iPhone Development update</title><content type='html'>Just a quick update on the iPhone development I have been doing.  Generally out of curiosity and the fact that I like learning new stuff for the hell of it I have been teaching myself iPhone development on my daily commute.&lt;br /&gt;&lt;br /&gt;I'm normally a .Net developer or Message Broker developer (yeah ok strange hybrid I know...) I have done java in the past and a number of other languages over the years but objective C is an interesting and subtlety different beast in many ways.&lt;br /&gt;&lt;br /&gt;I am working on a laptop on my daily commute without wifi access on the train it is helping me to relive old-skool development in the truest sense.  Old enough to remember what development was like pre-internet (or at least pre-internet for the general public.)  We once have to read through dusty manuals to understand how the api's worked ourselves and not rely on the google,cut,paste development style that is easy to rely on today.  So when coding I don't have the crutch of the internet to lean on and have to work it out for myself.  Far more satisfying when you get it to work, and far more educational in really understanding how it really works.&lt;br /&gt;&lt;br /&gt;I am currently cleaning up my code isolating any memory leaks that have crept in,  no namby-pamby garbage collection here!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1243482600487376872?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1243482600487376872/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1243482600487376872' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1243482600487376872'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1243482600487376872'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/07/iphone-development-update.html' title='iPhone Development update'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-5838224524591543899</id><published>2009-06-09T21:48:00.004+01:00</published><updated>2009-06-18T20:11:03.137+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOAP'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM Message Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='WSDL'/><category scheme='http://www.blogger.com/atom/ns#' term='source control'/><category scheme='http://www.blogger.com/atom/ns#' term='6.1'/><title type='text'>Exporting an external WSDL from a deployable WSDL in a project under source control</title><content type='html'>Here's a little gem that I ran into recently that caused me some frustration.&lt;br /&gt;&lt;br /&gt;Exporting an external WSDL from a deployable WSDL in a project under source control.&lt;br /&gt;I have been developing a SOAP based webservice to expose a message flow as a web service and all was going well.  I was able to generate an external WSDL file that I could hand over to another team to develop against.  I was taking the default options to generate the WSDL file to include a nested file structure beneath it with the associated .xsd's.  However all I was receiving in my target directory was the .WSDL and nothing else.  No errors, no warnings, nothing hived away in the event log.  The schema locations in the WSDL referred to non existent relative locations to the WSDL.  Hmmm, I was sure I had seamlessly done this only a few days before with a similar web service.&lt;br /&gt;&lt;br /&gt;The only difference was that I was not diligently working under source control on the original development.  The client I am working for uses IBM's Clearcase as a source repository.  &lt;br /&gt;&lt;br /&gt;When you try to generate a WSDL the toolset creates the required .xsd's for the messages from the original .mxsd's locally in your message set project.  (Something like .generatedschemas) But due to my project being under source control many of the directories are marked as read only and so this task was steathily and silently failing.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;The solution &lt;/span&gt;:- For me the solution was a quick and easy work around.  I created a brand new message set project and one of the options allows you to create based upon on existing message set.  I created this project outside the realms of source control.  Generated the WSDL and hey presto! I had all my associated .xsd's too. (Of course don't forget to promptly delete this second message set project and only make changes to the original one...)&lt;br /&gt;&lt;br /&gt;Wouldn't a nice informative error message of pointed me in the right direction in the first place?&lt;br /&gt;&lt;br /&gt;Another tip when dancing the tango with the WSDL editor is that when you edit the source code of the WSDL it is not immediately validated upon saving.  Sometimes you have to prompt the toolkit to revalidate the WSDL file by right clicking on the WSDL source and selecting "validate".  I have carefully checked the location of my .mxsd files at the sight of a WSDL full of red X's only to find out that it just needed revalidating when the files are all in the correct location.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-5838224524591543899?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/5838224524591543899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=5838224524591543899' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/5838224524591543899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/5838224524591543899'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/06/exporting-external-wsdl-from-deployable.html' title='Exporting an external WSDL from a deployable WSDL in a project under source control'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-4366827802419480570</id><published>2009-06-09T21:39:00.002+01:00</published><updated>2009-06-09T21:44:22.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cruise control'/><category scheme='http://www.blogger.com/atom/ns#' term='IBM Message Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><title type='text'>"Flight of the Integrator" has landed</title><content type='html'>Time to rebadge my blog to something a little more snappy.  &lt;insert name here&gt; blog never really did it for me.&lt;br /&gt;&lt;br /&gt;Well it's been a roller coaster ride of late with a lot of big changes in my life recently.  The company I worked for being taken over, redundancy, 40th birthday and now a return to contracting.&lt;br /&gt;&lt;br /&gt;So here I am with my sleeves firmly rolled up back into the technical role that I know I truly love.&lt;br /&gt;&lt;br /&gt;I'll be posting tips and gotcha's here on my experience with IBM Message Broker, partly as a repository for myself and hopefully as a little something for others out there.&lt;br /&gt;&lt;br /&gt;I'm a regular visitor of the excellent developerworks and mqseries.net forums.  Always lurking in the background than making active contributions to date.  But there is nothing more frustrating to scour the net for an answer to a niggling technical problem when only a handful of potential posts come us all without any replies.  Finally, FINALLY you find a thread with a reply too.  Could this be the holy grail?  Could this be the answer to your woes that you have been persistently banging your head against?  Nope it's just some other poor soul reporting "yeah, I've got that problem too"  Gaaahhh!&lt;br /&gt;&lt;br /&gt;Well hopefully I'll be able to help some of you here by reporting the problems I've had and overcome. (Otherwise I won't bother writing them up..)&lt;br /&gt;&lt;br /&gt;Some of the subjects I am planning to document in the future are :-&lt;br /&gt;&lt;br /&gt;Continuous integration builds.  Ie. automated building and deployment with CruiseControl and Ant.  This is a tool that I've seen used successfully in large .Net projects to allow overnight automated building/deployment/testing to be performed.  I have been looking to see how far I can push CruiseControl on the Message Broker side to get as slick an implementation as possible.&lt;br /&gt;&lt;br /&gt;I know several articles have been written in the past about utilising Ant for building .bar files and applying overrides.  I plan to take it a little further to include deployment and automated testing.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Gotcha's&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Another section I am adding to my blog is the Gotcha's.  These will document the small things that you may/may not trip up on that will cost you time for either just being a bit daft/too lazy to read the doco/toolset not behaving as it should.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-4366827802419480570?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/4366827802419480570/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=4366827802419480570' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/4366827802419480570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/4366827802419480570'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/06/flight-of-integrator-has-landed.html' title='&quot;Flight of the Integrator&quot; has landed'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-3563030405890059742</id><published>2009-03-31T00:23:00.000+01:00</published><updated>2009-03-31T00:34:25.739+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Google docs'/><category scheme='http://www.blogger.com/atom/ns#' term='Cartoons'/><category scheme='http://www.blogger.com/atom/ns#' term='Picasa'/><title type='text'>My Cartoon Website receives a facelift</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.thebaines.co.uk/images/me.jpg"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 145px; height: 200px;" src="http://www.thebaines.co.uk/images/me.jpg" border="0" alt="" /&gt;&lt;/a&gt;Phew, I finally did it.  After having a pretty ropey website on the web for many years as a supposed "showcase" for my cartoons I got around to giving my cartoon website a facelift.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.thebaines.co.uk/"&gt;www.thebaines.co.uk&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For those unfortunates who ventured onto the old site (probably only friends and family) there was some very shoddy javascript that managed to make the site almost unusable, thankfully that is all gone.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had previously crafted some .aspx code for a simple contact form to avoid publishing my email address on the web.  I'm currently suffering a bit of a Google Docs love-in as I discovered how easy it is to add forms to your sites that offer exactly this functionality and more.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So now I have samples of some cartoons is a nice slideshow with the full images in a gallery on Picasa.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Time for bed..&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/8595347-3563030405890059742?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/3563030405890059742/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=3563030405890059742' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/3563030405890059742'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/3563030405890059742'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/03/my-cartoon-website-receives-facelift.html' title='My Cartoon Website receives a facelift'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-1554032068939995039</id><published>2009-03-28T14:09:00.000Z</published><updated>2009-03-28T20:46:12.017Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='BizTalk'/><category scheme='http://www.blogger.com/atom/ns#' term='Cloud'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Message Broker'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><title type='text'>I've finally moved into the cloud.</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_MrxBVBsXXsE/Sc4vkQxsWsI/AAAAAAAAADA/3iFo_klC_v0/s1600-h/integrator+trans.jpg"&gt;&lt;img style="CLEAR: both; FLOAT: left; MARGIN: 0px 10px 10px 0px" alt="" src="http://2.bp.blogspot.com/_MrxBVBsXXsE/Sc4vkQxsWsI/AAAAAAAAADA/3iFo_klC_v0/s320/integrator+trans.jpg" border="0" /&gt;&lt;/a&gt; I orginally set up this blog waaay back in 2004, when I was having my first wranglings with a newly released BizTalk 2004. At the time there was very little information on the product and I relied heavily on the blogging community to help me get through.&lt;br /&gt;&lt;br /&gt;Fast forward 5 (!) years and I feel it is about time I gave something back.&lt;br /&gt;&lt;br /&gt;Freshly enthused from DevWeek 2009 I feel its time to throw myself back into the part of the job I love the most.&lt;br /&gt;&lt;br /&gt;Cut me open and you'd see the word GEEK carved cleanly through my middle.&lt;br /&gt;&lt;br /&gt;So, what has happened over the last 5 years? I've been heavily involved in many aspects of system integration, hence the avatar to the left that sits proudly on my mug at work (The Integrator). I have been working on BizTalk 2004, 2006, IBM Message Broker, EAI, SOA, ESB's, XML, SOAP web services and all that malarky. REST based services seem to be gaining the inertia they truly deserve and will probably one of my pet projects in the near future.&lt;br /&gt;&lt;br /&gt;It was interesting to cut through all the hype of "the cloud" to see that in 5-10 years time the cloud will be the reality it currently promises. Once all the barriers of trust, true cost, reliabiliy and resilence are answered. Naturally not everything will belong in the cloud but my statement of "moving into the cloud" is certainly true. I finally switched over to using my Gmail account in earnest and setting up IMAP on my local email client (if I ever fire it up again...). So wherever I am I'll be able to access my emails, docs, photos etc.&lt;br /&gt;&lt;br /&gt;You may have guessed that cartooning is another of my hobbies so expect this blog to be peppered with the occasional picture too. Unless I end up as lazy as last time and the next posting appears in late 2014. &lt;div style="CLEAR: both; TEXT-ALIGN: left"&gt;&lt;a href="http://picasa.google.com/blogger/" target="ext"&gt;&lt;img style="BORDER-RIGHT: 0px; PADDING-RIGHT: 0px; BORDER-TOP: 0px; PADDING-LEFT: 0px; BACKGROUND: 0% 50%; PADDING-BOTTOM: 0px; BORDER-LEFT: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: 0px; -moz-background-clip: initial; -moz-background-origin: initial; -moz-background-inline-policy: initial" alt="Posted by Picasa" src="http://photos1.blogger.com/pbp.gif" align="middle" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-1554032068939995039?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/1554032068939995039/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=1554032068939995039' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1554032068939995039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/1554032068939995039'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2009/03/ive-finally-moved-into-cloud.html' title='I&apos;ve finally moved into the cloud.'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_MrxBVBsXXsE/Sc4vkQxsWsI/AAAAAAAAADA/3iFo_klC_v0/s72-c/integrator+trans.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8595347.post-109698176350746642</id><published>2004-10-05T13:44:00.000+01:00</published><updated>2004-10-06T09:08:36.340+01:00</updated><title type='text'>Biztalk 2004 - Relentless message sending to webservices</title><content type='html'>Following the trend of many others in the Biztalk 2004 community I thought I'd start a blog to share my highs and lows of learning the product. Hopefully the posts here will either be inspiring to others or can be shot down in flames by people more experienced than myself.&lt;br /&gt;&lt;br /&gt;I know during the step learning curve of Biztalk 2004 I have found peoples blogs and infinate source of advice and experience.&lt;br /&gt;&lt;br /&gt;The project I am currently working on is planning to use biztalk as a central layer for joining together multiple applications. One of the requirements of this solution is guaranteed delivery order of messages on the target applications.&lt;br /&gt;&lt;br /&gt;I have investigated a number of different techniques using receive ports / send ports without orchestrations and also message queues. However the companies preferred architecture was to expose all our systems using the platform independent web services rather than be tied into message queueing.&lt;br /&gt;&lt;br /&gt;After much trial and error, several deadends, head scratching, blog surfing I have come up with the following orchestration for sending messages sequentially using webservices.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Delivery Mechanism&lt;/strong&gt;&lt;br /&gt;The messages are received by the orchestration currently using a file adapter. (This was purely to simplify my test harness, so I could leisurely drop message 1,2,3,4 etc into the directory in the order that they would normally be delivered.) We had already developed a solution on our source app(s) to call a Biztalk generated webservice to deliver the messages to the port in the correct sequence, so reordering messages is not a requirement.&lt;br /&gt;&lt;br /&gt;The initial "Receive 1st message" shape on the orchestration uses a correlation set based upon the receive port name. Meaning that only one orchestration is invoked for any messages received on this port. This stops messages arriving at a later time being received and processed out of sequence.&lt;br /&gt;&lt;br /&gt;There is a futher "Receive Next Message" shape in the orchestration using a follow on correlation for the same correlation set.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Message Transmission&lt;/strong&gt;&lt;br /&gt;The basic premise is that the orchestration will only run as long as it is trying to send messages to the destination webservice. If this destination webservice is unavailable an exception will be thrown and caught by the orchestration&lt;em&gt;. (Does anyone know how to catch an exception of type Microsoft.Xlangs.Core.XlangSoapException ? This is something I have failed to resolve so far&lt;/em&gt;.) If the send to the webservice has failed a simple "Failure Message" gets sent to a failure port. Again for simplicity of testing this is using a file adapter.&lt;br /&gt;&lt;br /&gt;After a 30 second delay the orchestration will try the send to webservice again. This delay could be amended to whatever you like. When deploying the orchestration I changed the default number of retries on the send port from 3 to 0. This means that as soon as the webservice fails the exception is raised. Otherwise you have to wait for 3 retries to fail before you can test if your code is working, not ideal for productivity.&lt;br /&gt;&lt;br /&gt;The orchestration will retry again and again tirelessly every 30 seconds waiting for the webserver to become available. I found the best way to simulate webservice failure was to use IIS to stop the website hosting the webservices.&lt;br /&gt;&lt;br /&gt;Meanwhile because of the correlation any further messages received on the receive port are queued by Biztalk waiting until the current message has been successfully transmitted.&lt;br /&gt;&lt;br /&gt;Finally the webservice becomes available and the message is transmitted to the webservice. As an additional "nice to have" I added some additional code to notify you that the failed message has now been successfully sent. After potentially deluging a support department with emails that a send to a webservice had failed I thought it was only polite to let them know that all is well again.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Next Message(s)&lt;/strong&gt;&lt;br /&gt;Once the message has been sent successfully Biztalk will get on with the task of processing any remaining message that may have queued up whilst the webservice was out of action.&lt;br /&gt;&lt;br /&gt;If there are no further messages to send the orchestration will terminate and disappear from HAT.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Download&lt;/strong&gt;&lt;br /&gt;Message sending Orchestration &lt;a href="http://www.thebaines.co.uk/biztalk/MessageSending.zip"&gt;http://www.thebaines.co.uk/biztalk/MessageSending.zip&lt;/a&gt;&lt;br /&gt;Test Webservice &lt;a href="http://www.thebaines.co.uk/biztalk/TestWebService.zip"&gt;http://www.thebaines.co.uk/biztalk/TestWebService.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;br /&gt;Still being a relatively n00b to Biztalk I would appreciate any feedback on the proposed Orchestration to see if I have made any glaring errors or overlooked any scenarios that blow this design out of the water.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8595347-109698176350746642?l=robbaines.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://robbaines.blogspot.com/feeds/109698176350746642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8595347&amp;postID=109698176350746642' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/109698176350746642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8595347/posts/default/109698176350746642'/><link rel='alternate' type='text/html' href='http://robbaines.blogspot.com/2004/10/biztalk-2004-relentless-message.html' title='Biztalk 2004 - Relentless message sending to webservices'/><author><name>Rob Baines</name><uri>http://www.blogger.com/profile/00375091549031232284</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='23' src='http://3.bp.blogspot.com/_MrxBVBsXXsE/Sc4xh43PSXI/AAAAAAAAADM/xoPqaDQkUHc/S220/integrator+trans.jpg'/></author><thr:total>2</thr:total></entry></feed>
