<?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-3668443614153236059</id><updated>2012-02-16T17:19:46.570Z</updated><category term='graphics cards'/><category term='computers'/><category term='stupidity'/><category term='mac'/><category term='wireless network'/><title type='text'>Blind to undecidability</title><subtitle type='html'>Computer chat, problems I have had and fixed, and maybe some stuff about my research in software verification (where undecidability is always lurking around the corner, but we plough on anyway!)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-4440642398513444542</id><published>2010-01-12T15:50:00.000Z</published><updated>2010-01-12T16:01:48.410Z</updated><title type='text'>Tales from Verification History</title><content type='html'>&lt;p&gt;For anyone interested in the &lt;a href="http://allydonaldson.blogspot.com/2010/01/verification-controversy.html"&gt;Verification controversy&lt;/a&gt; post below, my colleague &lt;a href="http://www.comlab.ox.ac.uk/people/Vijay.DSilva/"&gt;Vijay&lt;/a&gt; recently did a really great presentation at the &lt;a href="http://www.comlab.ox.ac.uk/"&gt;Oxford Comlab&lt;/a&gt; entitled &lt;i&gt;Tales from Verification History&lt;/i&gt;.  The talk discusses the background surrounding the current debate, and references all the relevant papers.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://web.comlab.ox.ac.uk/people/Vijay.DSilva/talks/Cakes_Talk_Extended_DVD.pdf"&gt;Slides for the presentation are available&lt;/a&gt; together with &lt;a href="http://web.comlab.ox.ac.uk/people/Vijay.DSilva/talks/Tales%20from%20Verification%20History%20Commentary.pdf"&gt;a transcript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For a discussion of the &lt;a href="http://doi.acm.org/10.1145/359104.359106"&gt;“Social Processes and Proofs of Theorems and Programs”&lt;/a&gt; paper, see slide 48, and page 14 of the transcript (but I would thoroughly recommend reading the whole thing).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-4440642398513444542?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/4440642398513444542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2010/01/tales-from-verification-history.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/4440642398513444542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/4440642398513444542'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2010/01/tales-from-verification-history.html' title='Tales from Verification History'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-5257982689637883800</id><published>2010-01-12T12:45:00.001Z</published><updated>2010-01-12T12:56:19.693Z</updated><title type='text'>Verification controversy</title><content type='html'>&lt;p&gt;My colleague, &lt;a href="http://www.comlab.ox.ac.uk/people/Vijay.DSilva/"&gt;Vijay D'Silva&lt;/a&gt;, has an exceptional capacity for keeping abreast of literature, debate, and “who's who” in formal verification.  He frequently tips off our &lt;a href="http://www.cprover.org/"&gt;formal verification group&lt;/a&gt; about interesting developments.&lt;/p&gt;

&lt;p&gt;Yesterday, he alerted me to a wonderful piece of controversy in the verification world.  &lt;a href="http://www.cs.rice.edu/~vardi/"&gt;Moshe Vardi&lt;/a&gt;, Editor in Chief of &lt;a href="http://cacm.acm.org/"&gt;Communications of the ACM&lt;/a&gt;, recently published an editorial encouraging wider debate in Computing Science.  His editorial starts with a reference to a famous paper of &lt;a href="http://www.cc.gatech.edu/directory/richard-demillo"&gt;Richard A. De Millo&lt;/a&gt;, &lt;a href="http://rjlipton.wordpress.com/"&gt;Richard J. Lipton&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Alan_Perlis"&gt;Alan J. Perlis&lt;/a&gt;: &lt;a href="http://doi.acm.org/10.1145/359104.359106"&gt;“Social Processes and Proofs of Theorems and Programs”&lt;/a&gt;, which &lt;i&gt;Communications&lt;/i&gt; published in 1979.  “Social Processes...” takes the view that formal verification is doomed to fail, for a variety of well-argued reasons.  Vardi's view is that the article, 30 years, on, looks rather misguided.&lt;/p&gt;

&lt;p&gt;This editorial has certainly fulfilled Vardi's aim of sparking off some debate, though actually on &lt;a href="http://rjlipton.wordpress.com/2010/01/11/why-do-we-need-cyber-security/"&gt;Richard Lipton's blog&lt;/a&gt; rather than in &lt;i&gt;Communications&lt;/i&gt; - the surviving authors of "Social Processes..." have not taken his comments well!!&lt;/p&gt;

&lt;p&gt;I hadn't read this famous article, and did so today.  It's wonderful – if you haven't read it, then please do so now!  While I disagree that the article was misguided, Vardi is right that the verification community has moved on, and some of the arguments in “Social Processes...” do not apply to what we now think of as formal verification.  This is not because De Millo et al. were wrong, it's because the goals of formal verification have changed.&lt;/p&gt;

&lt;p&gt;I thought I'd discuss two particular points in this area that are important to me, as a proponent of pragmatic formal verification.&lt;/p&gt;

&lt;h2&gt;What we want to verify has changed&lt;/h2&gt;

&lt;p&gt;Back in 1979, the goal of verification was to show that a program “is correct”, i.e. meets its specification.  The idea was that the requirements a program should satisfy would be formalised, then the program, as a monolithic unit, would be shown logically to satisfy the formal properties, via a formal proof.&lt;/p&gt;

&lt;p&gt;There are many practical problems associated with doing such a proof, whether manually or automatically, even if the program's requirements have been formalised.  However, the &lt;b&gt;fundamental&lt;/b&gt; problem is the difficulty of formalising whole-program requirements for large pieces of software.  This simply cannot be done for large applications like compilers or word processors.  For simpler programs, a formalisation of requirements may be possible, but the formalisation might be extremely complex and hard-to-understand.  It may be necessary to use temporal logic to state properties, in which case, in my opinion, the game is up: even moderately complex formulae in temporal logics are virtually impossible to understand intuitively.&lt;/p&gt;

&lt;p&gt;The modern, pragmatic standpoint on this issue is much simpler.  Limit the scope of formal verification.  Instead of aiming to prove whole-program correctness, just try to determine whether an assertion at a particular program point can be violated.  The crucial point here is that an assertion states something unambiguous about a low-level, but important, detail of a program.  For example, that a value should remain within a certain range, or that two boolean flags should never simultaneously be true.  Modern programmers write assertions all the time.  Of course, they cannot be used to specify whole-program correctness for complex systems, but as De Millo et al. rightly point out, the notion of whole-program correctness is a dream anyway.  Unfortunately, checking assertions is still algorithmically impossible in general.  Nevertheless, automated techniques can go a long way in this area.&lt;/p&gt;

&lt;h2&gt;What we expect a verifier to tell us has changed&lt;/h2&gt;

&lt;p&gt;In the “Disbelieving Verifications” part of the paper, the authors argue that, if the programmer gets the message 'VERIFIED', from an automatic verification tool (if such a tool could indeed be built), this “mystical stamp of approval” would tell them very little.  However, the authors note that in practice, the programmer would &lt;b&gt;never&lt;/b&gt; get this answer: for, say, a 20,000 line program, they would always get 'NOT VERIFIED', since no sizeable program is ever perfect.&lt;/p&gt;

&lt;p&gt;The techniques of 1979 did indeed aim simply to decide whether or not a program was correct.  Many modern techniques do more than this, particularly model checking.  The strength of a model checker is that, when asked to verify say whether an assertion in a C program can ever be false, if the answer is “yes it can”, the tool also says “and here's how: ...”, and reports an execution sequence illuminating the bug.  Unlike a mechanical correctness proof, these &lt;i&gt;counterexamples&lt;/i&gt; &lt;b&gt;can&lt;/b&gt; be understood by programmers, who can use the counterexamples to debug their program.&lt;/p&gt;

&lt;p&gt;If a programmer uses a verifier to reveal bug after bug in their program, via counterexamples, and then, after 20 bugs have been fixed, the verifier finally reports 'VERIFIED', then this stamp of approval does not seem so mystical.  The programmer's confidence in the program has increased due to all the fixed bugs.  The verification tool proved its worth by managing to find those bugs, and the fact that it cannot find any more suggests that &lt;i&gt;something&lt;/i&gt; is right about the program!&lt;/p&gt;

&lt;p&gt;Counterexamples relate to another major point in “Social Processes...”: that when a mathematician does a proof, they leap up and say “I've got it!”, and run and tell their colleagues, to whom they try to justify the proof.  This leads to discussion, perhaps to a refutation of the proof, or increased confidence in it.  This discussion and excitement is at the heart of the social process of mathematics.  However, “formal verifications”, i.e. the sequences of logical steps used to prove a program correct, do not generate such excitement and do not form part of a social process: the results of one formal verification are of no interest to software practitioners in general, and one verification result provides no general insight into the correctness of whole classes of programs, nor even to syntactically similar programs.&lt;/p&gt;

&lt;p&gt;However, one &lt;i&gt;can&lt;/i&gt; get excited about counterexamples.  When I take the time to understand a counterexample, the counterexample surprises me.  I think: “Ah, I see!!!”.  My assumptions about aspects of my algorithm are shattered and need to be re-thought.  Sometimes I am so excited that I &lt;b&gt;do&lt;/b&gt; run and tell my colleagues.  (Sometimes I get so excited that I recount stories of nasty bugs I have found to my wife, who unfortunately has no idea what I'm talking about and quickly tries to change the subject!)  From a given counterexample, one can think of a simpler counterexample representing the same bug.  Then one can extract the essence of the bug which the counterexample represents.  If this class of bugs proves very important, this might lead to designers of verification tools tuning their algorithms to be super-aware of bugs of this nature, so that their tools can quickly report easy-to-understand counterexamples.  This is a social process.&lt;/p&gt;

&lt;p&gt;In summary, it is true that formal verification has had success over the last 30 years, particularly due to advances in model checking.  However, I think it's a massive leap for Vardi to suggest that formal verification has been so successful that it rebuts the many compelling arguments in De Millo, Lipton and Perlis's paper.  It's fairer to say that the goals of verification have changed.  And we in the verification community should not get too carried away with what we have achieved.  Software developers are not yet using verification tools on a regular basis.  They are not built into mainstream compilers like GCC.  There is a long way to go.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-5257982689637883800?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/5257982689637883800/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2010/01/verification-controversy.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5257982689637883800'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5257982689637883800'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2010/01/verification-controversy.html' title='Verification controversy'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-1590999881987085332</id><published>2009-12-16T10:38:00.001Z</published><updated>2009-12-16T10:57:48.287Z</updated><title type='text'>DMA race checking</title><content type='html'>&lt;p&gt;I am in a good mood this week because I (together with my co-authors &lt;a href="http://www.kroening.com/"&gt;Daniel Kroening&lt;/a&gt; and &lt;a href="http://www.philipp.ruemmer.org/"&gt;Philipp Ruemmer&lt;/a&gt;) just had a paper accepted to &lt;a href="http://tacas10.in.tum.de/"&gt;TACAS&lt;/a&gt; on checking DMA races in multicore software.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.allydonaldson.co.uk/papers/2010/TACAS.pdf"&gt;The paper is online here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The inspiration for this work came via my experience at &lt;a href="http://www.codeplay.com/"&gt;Codeplay Software Ltd.&lt;/a&gt;, writing system-level code for the &lt;a href="http://en.wikipedia.org/wiki/Cell_(microprocessor)"&gt;Cell processor&lt;/a&gt;.  To achieve high performance on a Cell SPE, you needs to write low-level DMA operations to pre-fetch data.  Getting these operations correct is hard - it's easy to end up with two DMA get operations simultaneously writing to the same local buffer, and corrupting it.&lt;/p&gt;

&lt;p&gt;Our paper first shows how bounded &lt;a href="http://en.wikipedia.org/wiki/Model_checking"&gt;model checking&lt;/a&gt; can be used to automatically find bugs with the way DMA operations are used.  Then it shows how a technique called k-induction (&lt;a href="http://www.cse.chalmers.se/~ms/FMCAD00.pdf"&gt;introduced in this paper&lt;/a&gt;) can be used to actually prove &lt;i&gt;absence&lt;/i&gt; of bugs for certain classes of programs, which is a lot harder to do.&lt;/p&gt;

&lt;p&gt;We've made a tool, &lt;a href="http://www.cprover.org/scratch/"&gt;Scratch&lt;/a&gt;, which accepts Cell SPE programs involving DMA operations, and checks them to find, or prove absence of, DMA-related bugs.  We used Scratch to find a bug in one of the examples that comes with the IBM Cell SDK (&lt;a href="http://www.ibm.com/developerworks/forums/thread.jspa?threadID=277395&amp;tstart=75"&gt;see report on Cell BE forum&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;IBM also have a race check library that can be useful in finding DMA-related bugs, and finds them very quickly &lt;i&gt;if they occur on a given test input&lt;/i&gt;.  Scratch has the advantage that it uses symbolic execution, so can find more subtle bugs by considering program execution for all possible input values.&lt;/p&gt;

&lt;p&gt;Scratch needs some more work before it will be of much use to Cell BE developers; in particular it doesn't yet handle all the vector language extensions which are used by SPE programmers.&lt;/p&gt;

&lt;p&gt;However, it will in due course, so if you are interested in using Scratch please contact me and I'll prioritise development of particular features that you require to get started!&lt;/p&gt;

&lt;p&gt;The bad news is that the &lt;a href="http://www.playstationuniversity.com/ibm-cancels-cell-processor-development-1295/"&gt;Cell appears to be somewhat on a downer&lt;/a&gt;.  However, similar issues arise when performing asynchronous memory copies in GPU programming, which is definitely on the up (especially with the &lt;a href="http://www.khronos.org/opencl/"&gt;OpenCL&lt;/a&gt; language), so I think there's a lot of cool stuff still to do in this area!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-1590999881987085332?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/1590999881987085332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/12/dma-race-checking.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/1590999881987085332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/1590999881987085332'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/12/dma-race-checking.html' title='DMA race checking'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-2299975784241972076</id><published>2009-12-01T14:31:00.000Z</published><updated>2009-12-01T14:41:08.479Z</updated><title type='text'>Having trouble getting the Murphi verifier to compile?</title><content type='html'>I've spent quite a bit of time today getting the Murphi verification tool to compile.  I thought I'd write down how I did it in case this is of use to others.

&lt;p&gt;First, I found that the version &lt;a href="http://www.cs.utah.edu/formal_verification/software/murphi/stanford/murphi-3.1.tgz"&gt;here&lt;/a&gt; did not compile due to flex/yacc errors.  I don't know how to solve these, but luckily the version &lt;a href="http://www.cs.utah.edu/formal_verification/software/murphi/stanford/Murphi3.1.tar.Z"&gt;here&lt;/a&gt; (which has the same version number!) didn't present those problems.

&lt;p&gt;Instead, it gave me this error:

&lt;br&gt;error.C:58:20: error: stream.h: No such file or directory
&lt;br&gt;In file included from mu.h:441,
&lt;br&gt;                 from error.C:56:

&lt;p&gt;It seems that stream.h comes from the days before C++ include files didn't finish with ".h".  This header file has been deprecated for some time, but it seems that with gcc 4.3.3, which I have, it is not even provided.

&lt;p&gt;It turns out that GCC 4.2.2 comes with a folder called "backward", that has "stream.h" and related header files.  Armed with these files (&lt;a href="http://www.allydonaldson.co.uk/misc/backward.tgz"&gt;which I provide online&lt;/a&gt;), I was able to get Murphi to compile OK by changing one line in the makefile from:

&lt;p&gt;CFLAGS = -O4 # options for g++

&lt;p&gt;to

&lt;p&gt;CFLAGS = -O4 -I /home/scratch/gcc4.2.2_backward/backward  # options for g++

&lt;p&gt;(this is where I put the "backward" files).

&lt;p&gt;Happy Murphi-ing!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-2299975784241972076?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/2299975784241972076/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/12/having-trouble-getting-murphi-verifier.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/2299975784241972076'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/2299975784241972076'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/12/having-trouble-getting-murphi-verifier.html' title='Having trouble getting the Murphi verifier to compile?'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-5393082482250840819</id><published>2009-11-25T11:19:00.000Z</published><updated>2009-11-25T11:27:37.970Z</updated><title type='text'>Northern Concurrency Workshop</title><content type='html'>I am just back from the &lt;a href="http://homepages.cs.ncl.ac.uk/j.w.coleman/ncw2009/"&gt;Northern Concurrency Workshop&lt;/a&gt;, which was organised by &lt;a href="http://homepages.cs.ncl.ac.uk/j.w.coleman/"&gt;Joey Coleman&lt;/a&gt; at Newcastle University.
&lt;br&gt;

It was a really, really fun event.  The talks were largely dominated by separation logic, which I am only just getting into, so I would say I understood less than 30% of the speakers' words.  Nevertheless, most of the other 70% sounded tantalisingly interesting even though it was over my head!  I gave a more practical talk on applying model checking to multicore programs with DMA.
&lt;br&gt;

What I liked about the workshop is that despite some pretty big names in concurrency theory being present, the atmosphere was very relaxed.  There was a lot of friendly discussion; it really did have the feel of a workshop, rather than just a series of talks.
&lt;br&gt;

The standout presentation for me was &lt;a href="http://homepages.cs.ncl.ac.uk/j.w.coleman/ncw2009/talks/2009-11-NCW-JWickerson.pdf"&gt;"Verifying malloc"&lt;/a&gt;, given by &lt;a href="http://www.cl.cam.ac.uk/~jpw48/"&gt;John Wickerson&lt;/a&gt; from University of Cambridge.  It was really well explained, and so obviously of practical importance.

&lt;br&gt;
It is expected that there will be another one in Cambridge in September 2010, so I look forward to that!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-5393082482250840819?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/5393082482250840819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/11/northern-concurrency-workshop.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5393082482250840819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5393082482250840819'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/11/northern-concurrency-workshop.html' title='Northern Concurrency Workshop'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-5265966995406040576</id><published>2009-10-14T08:14:00.000+01:00</published><updated>2009-10-14T08:27:07.684+01:00</updated><title type='text'>Glasgow</title><content type='html'>&lt;p&gt;This weekend I had a flying visit to Glasgow for a session with my band, and to see a musical put on by a company which my wife Chris used to be a member of.  Apologies to friends of mine in Glasgow who I didn't get a chance to see -- next time hopefully I'll be up for longer.&lt;/p&gt;

&lt;p&gt;It was wonderful to be back in Glasgow.  Maybe it's just because I know it, but the city seems so fluid and easy to get around in.  I drove to Byres road for a coffee with my mother, and effortlessly slipped into a space where you can park free for 30 minutes.  I drove from there to Berkeley studios via the Clydeside expressway which is smooth and fast, and then when I needed to be in the west end a bit longer I easily found somewhere free to park just a few streets away.  Maybe I could do this in Oxford if I knew it better, but my experience of driving in Oxford so far has been awful!&lt;/p&gt;

&lt;p&gt;I met up with the Latonic guys for drinks after seeing the musical, and we went to a really cool basement bar on Bath Street, can't remember the name, where our mate Mehdi was DJing.  I left the bar around 2, and then had the most amazing experience -- I wanted some food and was fully prepared to be ripped off at some awful chippy like Mr Chips, when I saw that Greggs was open.  Yes, Greggs the baker, at 2am!  So instead of paying £3 for a portion of under-cooked chips served to me by a weary chip shop owner, I paid £1.60 for two cheese and onion pasties, which are &lt;b&gt;exactly&lt;/b&gt; what one wants after several drinks, and was served by a very friendly member of Greggs staff.  It was amazing!&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.digitalspy.co.uk/forums/showthread.php?t=765065"&gt;It seems like some other people have been talking about this too&lt;/a&gt;.  I suppose it might be bad news for the chip shops, and maybe bad news for the Greggs staff, but it's OK by me!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-5265966995406040576?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/5265966995406040576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/10/this-weekend-i-had-flying-visit-to.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5265966995406040576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5265966995406040576'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/10/this-weekend-i-had-flying-visit-to.html' title='Glasgow'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-5658350371808872641</id><published>2009-09-29T12:18:00.000+01:00</published><updated>2009-09-29T12:25:22.089+01:00</updated><title type='text'>Bash hates enthusiasm</title><content type='html'>&lt;p&gt;
I often feel good when I get to "svn commit" something.  I want to type something like:
&lt;/p&gt;

&lt;p&gt;
&lt;span style="font-family:courier new;"&gt;svn commit -m "Example ready to go!"&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;
But this enthusiasm is not welcomed by the bash shell, which says:
&lt;/p&gt;

&lt;p&gt;
&lt;span style="font-family:courier new;"&gt;bash: !": event not found&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;
So I have to type:
&lt;/p&gt;

&lt;p&gt;
&lt;span style="font-family:courier new;"&gt;svn commit -m "Example ready to go\!"&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;
and reaching for the '\' key just doesn't seem spontaneous.  Especially on a Mac, where it's in the wrong bloody place!
&lt;/p&gt;

&lt;p&gt;
So I end up being firm, and typing the ploddingly unenthusiastic command:
&lt;/p&gt;

&lt;p&gt;
&lt;span style="font-family:courier new;"&gt;svn commit -m "Example ready to go."&lt;/span&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-5658350371808872641?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/5658350371808872641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/bash-hates-enthusiasm.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5658350371808872641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5658350371808872641'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/bash-hates-enthusiasm.html' title='Bash hates enthusiasm'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-4920176265791696386</id><published>2009-09-14T22:11:00.000+01:00</published><updated>2009-09-14T23:05:13.478+01:00</updated><title type='text'>A parallel algorithm which has been intriguing me</title><content type='html'>&lt;p&gt;When I was in 3rd year at the University of Glasgow, I learned about the Floyd-Steinberg error diffusion algorithm, a method for performing digital half-toning on images.  This is an extremely simple algorithm which produces a wonderful effect.  It converts a greyscale image, with many shades of grey:&lt;/p&gt;

&lt;img src="http://www.allydonaldson.co.uk/blog/images/Lena.png"&gt;&lt;/img&gt;

&lt;p&gt;into a black and white image which essentially looks the same; in particular which looks the same when viewed from a distance:&lt;/p&gt;

&lt;img src="http://www.allydonaldson.co.uk/blog/images/LenaBW.png"&gt;&lt;/img&gt;

&lt;p&gt;More generally the technique can be applied to a colour image using a large palette of colours, producing a similar image in a reduced palette.&lt;/p&gt;

&lt;p&gt;The technique is pretty well-known, but I'll quickly summarise how it works for greyscale images: pixels are visited left-right, top-bottom.  A pixel with greyscale value &lt;i&gt;p&lt;/i&gt; is replaced with 0 if &lt;i&gt;p&lt;/i&gt; &lt;= 128 (assuming 0 is black, 255 is white and 128 is mid-grey).  This has the effect of finding the “best match” for &lt;i&gt;p&lt;/i&gt; in the reduced palette.  But if &lt;i&gt;p&lt;/i&gt; goes from say 100 to 0 this has darkened the pixel significantly, and if p goes from 130 to 255 this has lightened the pixel significantly.  So, to compensate for this, the error associated with the palette decision for the pixel (old value minus new value) is propagated to surrounding pixels in the following way:

&lt;img src="http://www.allydonaldson.co.uk/blog/images/Errors.png"&gt;&lt;/img&gt;

&lt;p&gt;In the following diagrams, pixel 22 is set to 0 since it is less than 128.  Then 22x7/16=10 is added to the pixel immediately to the right, 22x1/16=1 to the pixel to the bottom right, 22x5/16=7 to the pixel below, and 22x3/16=4 to the pixel to the bottom left.&lt;/p&gt;

&lt;p&gt;(The &lt;a href="http://en.wikipedia.org/wiki/Floyd-Steinberg_dithering"&gt;Wikipedia entry for Floyd-Steinberg dithering&lt;/a&gt; gives some pseudo-code showing how the algorithm can be implemented.)&lt;/p&gt;

&lt;h2&gt;Parallelizing error diffusion&lt;/h2&gt;

&lt;p&gt;I'm no expert on this technique, and I don't know where the authors got these coefficients from, or why they work so well, but when I started working at &lt;a href="http://www.codeplay.com"&gt;Codeplay Software Ltd.&lt;/a&gt; in 2007 I was looking for interesting algorithms to try parallelising using their Sieve technology.  I remembered this algorithm as being particularly cool, and wondered if it was parallelizable.  I started from scratchy, trying to work out by myself if it could be parallelized, but I got stuck, so I did a bit of searching and came across &lt;a href="http://cs.wellesley.edu/~pmetaxas/ei99.pdf"&gt;this paper, which presents a parallel version of the method&lt;/a&gt;, by &lt;a href="http://cs.wellesley.edu/~pmetaxas/"&gt;Panagiotis T. Metaxas&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The paper makes the following observation: the top-left pixel in the image &lt;i&gt;must&lt;/i&gt; be processed first, and the pixel to its right second.  But once these two pixels have been processed, either the third pixel in the top row could be processed, &lt;i&gt;or&lt;/i&gt; the first pixel in the second row.  By continuing to reason in this way, we can number each pixel with an integer representing the time step at which it could be processed in a fully parallel machine:&lt;/p&gt;

&lt;img src="http://www.allydonaldson.co.uk/blog/images/AllPixels.png"&gt;&lt;/img&gt;

&lt;p&gt;Observe that there is a skewed diagonal of pixels which can be processed in parallel, and the length of this diagonal increases, reaching its peak as it crosses the middle of the image, then decreases.  For a large image there would clearly be a fair bit of opportunity for parallelization.&lt;/p&gt;

&lt;p&gt;When I read this paper I didn't feel too stupid for having got stuck with this problem: his algorithm is pretty clever, and apparently even Donald Knuth believed the Floyd-Steinberg algorithm to be inherently serial - see a quote in the paper.  (It occurs to me that perhaps Knuth has been somewhat mis-quoted - Knuth states that the algorithm is inherently serial because the pixel in the bottom right hand corner depends on processing of all other pixels.  While the point about dependences is true, Metaxas's approach shows that there is opportunity for parallelism.  But maybe Knuth simply meant that there is no way to process &lt;i&gt;every&lt;/i&gt; pixel in parallel.)&lt;/p&gt;

&lt;p&gt;&lt;b&gt;To be continued.&lt;/b&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-4920176265791696386?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/4920176265791696386/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/parallel-algorithm-which-has-been.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/4920176265791696386'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/4920176265791696386'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/parallel-algorithm-which-has-been.html' title='A parallel algorithm which has been intriguing me'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-5499156056225869340</id><published>2009-09-03T21:52:00.000+01:00</published><updated>2009-09-07T12:54:08.938+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='wireless network'/><title type='text'>Trouble getting Mac Book Pro to connect to wireless networks</title><content type='html'>&lt;div&gt;My mate Colin Riddell from Codeplay just helped me fix a problem with my beautiful new Mac Book, which I thought I'd write down the solution to before I forget, and in case other people have the same problem (looking online, a lot of people seem to have trouble getting their Macs to connect to wireless networks).
&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;Before that, I'll tell you something that really pisses me off - the whole &lt;span class="Apple-style-span" style="font-style: italic;"&gt;"A is better than B"&lt;/span&gt; issue with computers and operating systems.  The reason I got a Mac is that I have never used one before (well, actually my secondary school was kitted out with Mac Classics, but I haven't used one within living memory) and people often big them up.  When I was recording an album with my band Latonic, the studio we worked in used a Mac and swore by it (even though it crashed all the time, but in my recording experience, music software seems to push any machine to the limit).  So I've got a Mac Book Pro, and it is in many ways really lovely.  But &lt;span class="Apple-style-span" style="font-style: italic;"&gt;it does crash&lt;/span&gt;.  People often say things like "My Mac has never crashed", or even "Macs &lt;span class="Apple-style-span" style="font-style: italic;"&gt;don't&lt;/span&gt; crash".  But in my experience the former is not true, and the latter obviously &lt;span class="Apple-style-span" style="font-style: italic;"&gt;cannot&lt;/span&gt; be true - of course one can write a program for the Mac which crashes!&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;Anyway, so far I really love the Mac, apart from its AirPort program, which is used to manage wireless networks, and which in my opinion is really crap.  In contrast I really like the Windows wireless network manager.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;The problem I had over the last couple of days is that, having returned from holiday, I could not connect to my BT HomeHub wireless network using my Mac.  My PC laptop connects fine, and nothing has changed with the network.  I have MacOS 10.5.7.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;My problem was that AirPort would say:&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;div&gt;Status:  On&lt;/div&gt;&lt;div&gt;AirPort does not have an IP address and cannot connect to the Internet&lt;/div&gt;&lt;div&gt;Network name: BTHomeHub2-XXXX&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;At the top, Location is set to Automatic.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;No matter what I tried, I could not get the computer to connect to the network (even though this had been working fine before I went on holiday).&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;After a lot of messing around, this is the solution my mate Colin came up with:&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;&lt;ul&gt;&lt;li&gt;Under the "Location" drop down (in Network preferences) click "Edit Locations"&lt;/li&gt;&lt;li&gt;Click "+" to add a new location&lt;/li&gt;&lt;li&gt;Give this a name (I used NewLocation) and click "Done"&lt;/li&gt;&lt;li&gt;Click on "AirPort" on the left hand side, and make sure that your new location is selected under "Location"&lt;/li&gt;&lt;li&gt;You should see the same error message as usual about no IP address.&lt;/li&gt;&lt;li&gt;Click "Advanced", which will open a new dialogue box, and select the TCP/IP tab.&lt;/li&gt;&lt;li&gt;On the right, click "Renew DHCP Lease"&lt;/li&gt;&lt;li&gt;Click "OK"&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;You should now get connected fine to the wireless network.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;The weird thing is that you might expect to be able to solve this problem by selecting the "Automatic" location, then clicking "Advanced-&gt;TCP/IP-&gt;Renew DHCP Lease", but the weird thing is that the "Renew..." option isn't there for this location.  You can make it appear by clicking "Using DHCP" again, but that didn't fix the problem for me.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;
&lt;div&gt;I'm relieved this works, but I don't think it is a great fix to the problem - I still don't know what has gone wrong with the "Automatic" location, so I'd be interested to hear from any Mac experts who know about this.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-5499156056225869340?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/5499156056225869340/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/trouble-getting-mac-book-pro-to-connect.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5499156056225869340'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/5499156056225869340'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/trouble-getting-mac-book-pro-to-connect.html' title='Trouble getting Mac Book Pro to connect to wireless networks'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3668443614153236059.post-195832273145357711</id><published>2009-09-03T21:43:00.001+01:00</published><updated>2009-09-07T12:49:24.120+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='computers'/><category scheme='http://www.blogger.com/atom/ns#' term='graphics cards'/><category scheme='http://www.blogger.com/atom/ns#' term='stupidity'/><title type='text'>How to plug in a monitor</title><content type='html'>&lt;div&gt;I have frustrating problems with computers &lt;span class="Apple-style-span" style="font-style: italic;"&gt;all the time&lt;/span&gt;, and am totally reliant on internet sources to fix my problems.  So I thought I'd start writing down some of the problems I've had and how I fixed them, in case this can be useful to others.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;I'll start things on a high by telling you about how I couldn't work out how to plug in a monitor.&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;I just had a refreshing 2 week holiday away from Oxford, then a week of conference/summer school work, and got back to the Oxford Computing Laboratory to find that my office had moved.  This was good news - my office mates and I are now in a larger, nicer office in a more sociable part of our building.  The minor downside was that I had to set up my computer (which was ready set up when I arrived at Oxford).&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;For someone with a degree and PhD in Computing Science, plus 2.5 years of experience with a very practical software company, this shouldn't be a problem, but being a bit of a dufus when it comes to real computers I couldn't get the monitor to show anything.&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;div&gt;To cut a long story short, what I found out was that my machine has multiple DVI sockets on the back - there's a white DVI socket which looks like the regular one you should plug the monitor into, and that's what I was trying.  But then there are also 2 red DVI sockets (which look a bit different, they looks like they take more pins) at the bottom of the machine's case, on the back, which are apparently due to it having an external graphics card.&lt;/div&gt;&lt;div&gt;

&lt;br&gt;&lt;/br&gt;

&lt;/div&gt;&lt;div&gt;So, if you are like me and have this silly problem then look out for these mysterious additional DVI sockets!!  Of course you'll need a monitor to be reading this....&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3668443614153236059-195832273145357711?l=allydonaldson.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://allydonaldson.blogspot.com/feeds/195832273145357711/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/how-to-plug-in-monitor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/195832273145357711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3668443614153236059/posts/default/195832273145357711'/><link rel='alternate' type='text/html' href='http://allydonaldson.blogspot.com/2009/09/how-to-plug-in-monitor.html' title='How to plug in a monitor'/><author><name>Ally Donaldson</name><uri>http://www.blogger.com/profile/11032033754560810703</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='28' height='32' src='http://1.bp.blogspot.com/_dguxPPsbUEg/SqA7U4ofY2I/AAAAAAAAAAM/UWAfT1_fHuo/S220/PhotoForBlog.jpg'/></author><thr:total>0</thr:total></entry></feed>
