tag:blogger.com,1999:blog-67432212054291033052024-03-13T22:09:40.328-07:00snim2Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-6743221205429103305.post-15151446131880201472012-05-11T17:57:00.001-07:002012-05-11T17:57:59.719-07:00#efdhack2012 26th May 2012<div class='posterous_autopost'><p> <p style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;"><a href="http://efdhacks.bitbucket.org/"><img class="alignnone" title="Evidence for Development Training Session" src="http://efdhacks.bitbucket.org/images/RegionalTraining.jpg" height="324" alt="" width="432" /></a></p> <div style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;"> <div> <p>This one's a little different. <a href="http://www.pywm.eu/">Python West Midlands</a> is hosting a hackday to kick off a new open source project for a very interesting little charity called <a href="http://www.evidencefordevelopment.com/">Evidence for Development</a>(EfD). EfD wants to help people make better decisions about aid projects – at local and national level – by putting real data about the real situation in the hands of the people making the decisions.</p> <p>If you want to know if your aid programme is making a difference to the right people then you need to model the economy of your target village or district, before and after. Makes sense; simple science right? Problem is you can' afford a bunch of western econometricians crawling all over the place (cost too much, takes too long) and anyway their cash-based economic models don't work that well in a place where cash is only a small part of the economy (grow your own; harvest wild food; get paid in kind or cash or both for day labour; trade crops, labour or other goods; etc, etc). So EfD developed simple economic models that work in this environment, that can be learned and applied by locally trained people and that, are built to run on laptops. No reliance on big foundations' data centres.</p> <p>Last year EfD, in partnership with <a href="http://www.chanco.unima.mw/">Chancellor College of the University of Malawi</a> and <a href="http://www.wlv.ac.uk/">The University of Wolverhampton</a> developed a <a href="http://python.org/">Python</a>/<a href="http://www.mysql.com/">MySQL</a>app to model local economies that is already in use in several countries in Southern Africa.</p> <p>This year the challenge is bigger – to build software that can model national and international economies. The model exists and works (it has a great track record of predicting famine effects from annual summary surveys of rural economies). But the only current implementations are proprietary, ill-supported and not extensible. Smells like open source spirit.</p> <p>So for this hackday we're going to have with us the two developers who led the IHM development last year (from <a href="http://www.chanco.unima.mw/">Chancellor College</a> in Zomba, Malawi) and the developers of the modeling methodologies from EfD (from Barnes and Surrey – exotic eh?). We'll have a pretty complete<a href="http://www.mysql.com/">MySQL</a> database schema to work on and we hope to finish the day with a simple demo scenario that downloads reference data about a geographical area (a livelihood zone) produces a spreadsheet template to capture information about that livelihood zone (what they grow there, what they eat, how they make a living) runs some local completeness reports and uploads the captured data for merging (with other livelihood zone surveys) to allow analysis of a national survey.</p> </div> </div> <div style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;"> <div> <p><strong>I'm not a software developer, can I still contribute?</strong></p> <p>Yes! Absolutely. There are a number of jobs that can be contributed without writing any code. We would really appreciate the support of contributors who can build a web presence for these projects, write user and developer documentation, help spread the word and any number of jobs! If you're keen to help out, there will definitely be a place for you.</p> </div> </div> <p style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;"><strong>When:</strong></p> <p style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;">10:30 onwards, 26th May 2012. Please sign up <a href="http://efdhack2012.eventbrite.co.uk/" title="Eventbrite signup" target="_blank">here</a>.</p> <p style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;"><strong>Where:</strong></p> <p style="font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; line-height: 19px;">Thyme Software, Coventry University Technology Park, Puma Way, Coventry, CV1 2TT [<a href="http://g.co/maps/4mj43" target="_blank">map</a>]</p> </p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/efdhack2012-26th-may-2012">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-64168075734584906932011-10-30T21:28:00.001-07:002011-10-30T21:28:15.666-07:00How to evaluate your project<div class='posterous_autopost'><p style="text-align: center;"><div class='p_embed p_image_embed'> <img alt="" src="http://farm4.static.flickr.com/3575/3546334679_abb69fc9ff.jpg" /> </div> </p> <p style="text-align: center;"><span style="font-size: x-small;">Image by <a href="http://www.flickr.com/photos/mpeterke/" title="mpeterke on Flickr" target="_blank">mpeterke</a> on <a href="http://www.flickr.com" title="Flickr" target="_blank">Flickr</a></span></p> <p>This post is all about how to evaluate your project. This is something you will do ideally about half way through your work, but more realistically towards the end of your work, just before you write up. However, it's imporant that you plan your evaluation early on, otherwise you run the risk of getting almost to the end of your work and finding that your evaluation process isn't going to give you any good results. So, the main thing you need to understand when you are planning is how evaluation works in the sciences and how to apply that understanding to your own projects.</p> <p><strong><span style="font-size: medium;">Proof</span></strong></p> <p>Sometimes we see student dissertations which make claims like "this experiment has proved that ...". Almost always the student has used the word "proof" incorrectly, and will lose marks because they have given the impression that they have not understood the contribution that their work has made to the field they are working in. Very often students in this situation simply haven't understood how scientists use the word "proof".</p> <p><em>Proof</em>, in a scientific context, is a mathematical argument that is used to convince other mathematicians or scientists that a <em>theorem</em> (or a mathematical idea) is true. Proofs must never involve evidence or experiments, only arguments. There's an example proof of a simple theorem at the end of this post. </p> <p>Once mathematicians are convinced that a proof is correct (and sometimes that is difficult in itself, if the proof is several hundred pages long) then it is irrifutable. This is very different to the sort of science that is advanced by experiments, where another scientist can find new data or eveidence that shows that an old idea was wrong. </p> <p>So, we generally say that a <em>theorem</em> can be proved correct whereas a <em>hypothesis</em> (or guess!) can only be tested via experiments. A hypothesis might turn out to be wrong if experimental data cannot be found to support the hypothesis, or contradictary evidence is found. If a lot of evidence is found to support a hypothesis we might call it a <em>theory</em>. Even so, a theory cannot be proved correct in all cases. For example, if you came up with a theory that said all atoms have a particular shape, you might invent a special microscope to look at atoms and find out if they have your shape. This would provide some evidence to support your theory. You couldn't, however, test every single atom in the Universe, so your hypothesis might well become a theory, but it can never be "proved" correct. </p> <p><em>[Aside: there's a long literature in this sort of philosophy of science. If you are really interested, read <a href="http://plato.stanford.edu/entries/popper/" title="Karl Popper" target="_blank">Karl Popper</a> on <a href="http://www.amazon.co.uk/Logic-Scientific-Discovery-Routledge-Classics/dp/0415278449/" title="The Logic of Scientific Discovery" target="_blank">Falsification</a>, <a href="http://plato.stanford.edu/entries/ayer/" title="Alfred Jules Ayer" target="_blank">AJ Ayer</a> on <a href="http://www.amazon.co.uk/Language-Truth-Logic-J-Ayer/dp/0486200108/" title="Language, Truth and Logic" target="_blank">Verification</a> and <a href="http://plato.stanford.edu/entries/feyerabend/" title="Paul Feyerabend" target="_blank">Paul Feyerabend</a> on <a href="http://www.amazon.co.uk/Against-Method-Paul-K-Feyerabend/dp/1844674428/" title="Against Method" target="_blank">scientific revolutions</a> and <a href="http://www2.lse.ac.uk/philosophy/about/lakatos/Home.aspx" title="Imre Lakatos" target="_blank">Imre Lakatos</a> on <a href="http://www.amazon.co.uk/Proofs-Refutations-Logic-Mathematical-Discovery/dp/0521290384" title="Proof and Refutations" target="_blank">Proof</a>.]</em></p> <p><strong><span style="font-size: medium;">Scientific method</span></strong></p> <p><em>Scientific method</em> is the way that scientists decide whether a particular <em>hypothesis</em> (or guess) is likely to be a good model for the way the world works. If most scientists accept that the hypothesis is likely to be true, then we call it a <em>theory</em>. Of course, even theories have limitations, and it may be that as more experiments are carried out we find that a different theory fits the evidence better, or that the theory only works in certain circumstances. This is exactly what happened in physics to Newton's laws of motion. It turns out that Newton's laws describe the world pretty well in most cases, they can certainly tell you when your train is likely to arrive at its destination. For other circumstances, for example when you are travelling very fast, close to the speed of light, or for very small particles like quarks, other theories (like Einstein's theories or quantum mechanics) better fit the data we have gathered. Of course, much of this work in areas like physics is driven by what we can measure and observe. Better telescopes mean better theories of cosmology, and so on.</p> <p>In computer science we also have hypotheses that we can test. For example "functional programming languages can run just as efficiently as imperative languages", "online learning increases student engagement", "objects and inheritance improve code reuse in software companies", and so on.</p> <p>To be a true hypothesis, and not just the opinion of the author, a statement must be <em>refutable</em>, that is, it must be possible for experiments to determine that the hypothesis is incorrect. The opposite statement to a hypothesis is called an <em>alternate hypothesis</em>. Examples for the hypotheses listed above would be "functional languages are necessarily slower (or faster!) than imperative ones", "online learning has no effect on student engagement" and "objects and inheritance have no effect on code reuse in software companies".</p> <p>So, to evaluate your own research questions, you need to do the following:</p> <ol> <li>Devise a hypothesis.</li> <li>Form your alternative hypothesis.</li> <li>Plan an experiment that tests whether the hypothesis or the alternative hypothesis is true. </li> <li>Conduct your experiment.</li> <li>Analyse the results of your experiments.</li> <li>If the results are conclusive, STOP. Else, re-run the experiments, or devise a better experiment and repeat.</li> </ol> <p>In a student project, you may not have time to repeat your experiments, especially if they involve people, but you should design your evaluation in such a way that this would be possible, were you to continue the work.</p> <p><strong><span style="font-size: medium;">About experiments</span></strong></p> <p>A good experiment should test one variable and one variable only. So, if your hypothesis is "neural network algorithms run faster in C than C++" then you will probably want to implement some neural network algorithms in both languages. You should make sure that the programs are as similar as possible, except for the language you are using. If you implement slightly different algorithms, it may be the algorithm and not the language which is causing any change in performance you observe. In this case, the programming language is called the <em>independent variable</em> and the algorithms are called the <em>controlled variable</em> and the speed is the <em>dependent variable</em> which is being measured. </p> <p><strong><span style="font-size: medium;">Interpreting your results: correlation does not imply causation</span></strong></p> <p style="text-align: center;"><div class='p_embed p_image_embed'> <img alt="" src="http://imgs.xkcd.com/comics/correlation.png" /> </div> </p> <p style="text-align: center;"><span style="font-size: x-small;"><a href="http://xkcd.com/552/" title="Correlation on xkcd" target="_blank">Correlation</a> by <a href="http://xkcd.com/" title="xkcd web comic" target="_blank">xkcd</a></span></p> <p style="">When you perform an experiment, you are hoping that the outcome will lend some evidence to either your hypothesis or your alternate hypothesis. Going back to the example above, they hypothesis "neural network algorithms run faster in C than C++" has an alternate hypothesis "neural network algorithms run no faster in C than in C++". If we run an experiment to test this, and assume it's a fair experiment, and the results are that all our algorithms run faster in C, what has this told us? A naive answer would be that the experiments have confirmed the hypothesis that C is the faster language for this sort of algorithm. A more subtle answer would be that efficient neural networks are <em>correlated</em> with neural networks written in C. That means that when the algorithm is written in C it's likely to run quickly, which is what the experiment reported. This does not necessarily mean that the algorithms implemented in C ran quickly <em>because</em> they were written in C, it may be that there was some other factor involved that the experiment didn't effectively control.</p> <p style="">In experimental work it is very important to understand this subtle distinction, otherwise you can easily fool yourself into believing that your experiments have discovered something far more conclusive than is actually possible. </p> <p style="">To give you a better idea of how this distinction between correlation and causation works, below are some examples of incorrect conclusions drawn from perfectly reasonable correlations. See if you can work out why the conclusions are unreasonable:</p> <ul> <li>Children with bigger feet have higher reading ages. Therefore, people with bigger feet are more intelligent.</li> <li>Teenagers who text late at night have poor motivation in class (see news reports <a href="http://www.news.com.au/technology/mobile-phone-use-harming-teens-health/story-e6frfrnr-1111116578606" title="Mobile phone use harming teen health" target="_blank">here</a>). Therefore, using mobile phones leads to poor performance in class (see also a more skeptical analysis <a href="http://www.skepticsfieldguide.net/2008/06/not-week-goes-by.html" title="Not a week goes by..." target="_blank">here</a>).</li> <li>In the last 150 years there has been a dramatic increase in the number of people who report being abducted by aliens. There has also been a trend towards global warming. Therefore, alien abductions cause global warming.</li> </ul> <p>In your own work, just be honest and straight forward about your results. If they aren't conclusive then say so and demonstrate your understanding by describing what future work could be done to gather more data. </p> <p style=""><strong><span style="font-size: medium;">Some basic dos and don'ts</span></strong></p> <p style="">This is some more specific advice, based on good and bad practice we have seen from students over the years:</p> <ul> <li>DO be clear and honest about what results your evaluation has obtained.</li> <li>DON'T claim to have "prooven" anything if you haven't written a formal, mathematical proof.</li> <li>DO use an appropriate experiment for your hypothesis. For example, if your work is about evaluating the performance or security of a technique, there is no need to involve real users in your evaluation. If your hypothesis is about usability you really must involve real users.</li> <li>DON'T use questionnaires unless you can guarentee to get a large sample size of answers (always well above thirty) and you understand the statistics needed to analyse the results. If you are in any doubt at all about this then seek the advice of a qualified statistician before you start your project. If you can't do that, think about using an alternative evaluation method such as semi-structured interviews.</li> </ul> <p style=""><strong><span style="font-size: medium;">Appendix</span></strong></p> <p style=""><span style="font-size: small;"><strong>Example proof: The square root of 2 cannot be written as a fraction of whole numbers</strong></span></p> <p style=""><strong>Theorem</strong></p> <p style="padding-left: 30px;">The square root of 2 cannot be written as a fraction of two whole numbers. (This is sometimes called the Theorem of Theaetetus)</p> <p style=""><strong>Proof (by contradiction)</strong></p> <p style="padding-left: 30px;">Imagine we could write the square root of 2 as a fraction of two whole numbers, say <em>x/y</em> where <em>x</em> and <em>y</em> are integers.</p> <p style="padding-left: 30px;">Let's say that <em>x</em> and <em>y</em> don't have any factors in common, so <em>x/y</em> is already written in its simplest form and no numbers can be "cancelled out" of the fraction.</p> <p style="padding-left: 30px;">So, we can also say that (<em>x/y)*(x/y)=2</em></p> <p style="padding-left: 30px;">Therefore <em>(x*x)/(y*y)=2</em></p> <p style="padding-left: 30px;">Therefore <em>(x*x)=2*(y*y)</em> </p> <p style="padding-left: 30px;">So we now know that <em>x*x</em> is even, since <em>x</em> is <em>2</em> times another number.</p> <p style="padding-left: 30px;">Since <em>x*x</em> is even, we also know that <em>x</em> is even (by the "Lemma" or little theorem that squares of odd numbers are never even).</p> <p style="padding-left: 30px;">Therefore, there must be a number, which we'll call <em>z</em> such that <em>x=2*z</em></p> <p style="padding-left: 30px;">So, <em>(2*z)*(2*z)=2*(y*y)</em></p> <p style="padding-left: 30px;">Or, more simply, <em>2*z*z=y*y</em></p> <p style="padding-left: 30px;"><em>y</em> must also be even, by the same argument that we used to say that <em>x</em> is even.</p> <p style="padding-left: 30px;">If <em>y</em> is also even, there must be some number, which we'll call <em>w</em> such that <em>y=2*w</em></p> <p style="padding-left: 30px;">But if <em>x/y=2z/2w</em> then the fraction <em>x/y</em> was not in its simplest form like we assumed above.</p> <p style="padding-left: 30px;">This contradicts our initial assumptions, which must have been wrong.</p> <p style="padding-left: 30px;">So, the square root of 2 cannot be written as a fraction of whole numbers.</p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/how-to-evaluate-your-project">Pass your university project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-79617508112194837212011-10-26T13:00:00.001-07:002011-10-26T13:00:17.215-07:00How to read research papers<div class='posterous_autopost'><p style="text-align: center;"><a href="http://www.flickr.com/photos/osiatynska/3287986172/"><img class="posterous_download_image" src="http://farm4.static.flickr.com/3341/3287986172_f7f153f5be.jpg" border="0" height="500" width="500" /></a></p> <p style="text-align: center;">Photo by <span style="color: #666666; line-height: 14px; background-color: #fefefe; font-size: small;"><span class="username" style="font-style: normal; display: inline !important; color: #222222; margin-top: 0px; font-size: 13px; line-height: 13px;"><a href="http://www.flickr.com/photos/osiatynska/" style="text-decoration: none; color: #0063dc;">ailatan</a> on <a href="http://www.flickr.com/photos/osiatynska/3287986172/" target="_blank">Flickr</a></span></span></p> <p>These last couple of weeks I've been taking my groups of final year project students through the process of starting their literature reviews. There is a separate post on literature reviews on this site <a href="http://projectsuccess.posterous.com/how-to-write-a-literature-review-for-your-fin" title="How to write a literature review" target="_blank">here</a> and a post on why you should read academic literature in Computer Science <a href="http://projectsuccess.posterous.com/why-read-from-primary-sources-or-why-reading" title="Why read from primary sources?" target="_blank">here</a>. This post isn't to do with those topics, this post is about <em>how</em> to read research papers. We often find that if students haven't done much of this sort of reading before their get to their final year getting started can be a bit of a shock. So, this post is designed to help you get started with academic literature and, just as importantly, to help you get the most out of the papers you read in the short space of time you have available (and it is a short space of time, believe me).</p> <p><strong><span style="font-size: medium;">Remember the structure of a paper is just like the structure of your thesis</span></strong></p> <p><span style="font-size: small;"><a href="http://projectsuccess.posterous.com/how-to-pass-your-final-year-thesis-project-0" target="_blank">Other</a> <a href="http://projectsuccess.posterous.com/how-to-write-a-literature-review-for-your-fin-0" target="_blank">posts</a> on this site have discussed the overall structure of your thesis, but in outline this is the sort of structure you should be expecting to produce:</span></p> <ul> <li><span style="font-size: small;"><strong>Introduction</strong> should introduce the reader to your research question and the broad context of the research.</span></li> <li><span style="font-size: small;"><strong>Literature review</strong> should describe the work that other people have carried out to answer your (or similar) research questions.</span></li> <li><span style="font-size: small;"><strong>Method</strong> should describe what you did to answer your research question (or to support your thesis, if you think of it that way), and how you went about it. </span></li> <li><span style="font-size: small;"><strong>Results</strong> should evaluate what you have done, and say what answer (to your research question) you have arrived at. </span></li> <li><span style="font-size: small;"><strong>Conclusions</strong> should summarise what you have done and how you answered the research question. </span></li> </ul> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: small;">Academic writing (in the sciences) of all sorts follows something like this structure, including all of the papers that you will be reading for your project. There are a couple of exceptions to this rule. One is theoretical papers which sometimes put their "related work" (or literature review) somewhere towards the end of the paper rather than after the introduction. The second exception is <em>survey papers</em>. Surveys are extended literature reviews and, as such, are a good place to start in your own literature reviews. <a href="http://dl.acm.org/citation.cfm?id=J204" title="ACM Computing Surveys" target="_blank">ACM Computing Surveys</a> is a journal that publishes survey papers or you can sometimes find them in reputable journals.</span></p> <p><span style="font-weight: bold; font-size: medium;">Briefly review each paper for relevance</span></p> <p><span style="font-size: medium;"><span style="font-size: small;">You don't have time to read everything, so it's important to make sure that what you do read is really relevant to your thesis. So, to check whether a paper is likely to be relevant to you first read the <strong>Abstract</strong>. This should give you a brief summary of the whole paper. So, at the very least the abstract should give you a good idea of what research question the authors were trying to answer. Next, read the <strong>Conclusions</strong>. This is also likely to be a summary and may well give you a better idea of what results the authors obtained and what work they did not finish but left for "future work". If that doesn't give you a good enough idea of the relevance of the paper to your own work, try reading the <em>last</em> part of the <strong>Introduction</strong>. This is usually where the authors summarise what is written in each of the following sections of the paper, so that should give you a much more detailed view of what the rest of the paper contains. </span></span></p> <p><span style="font-size: medium;"><span style="font-size: small;">If, after all of that, you think the paper is irrelevant to you, then discard it and move on to something else. Otherwise, you are ready to move on with your reading...</span></span></p> <p><span style="font-size: 13px;"> </span></p> <p><strong><span style="font-size: medium;">Focus your reading on specific questions</span></strong></p> <p><span style="font-size: small;">If you just go ahead and read a paper from start to finish the chances are that you won't get very much out of your efforts. You are likely to ramble around the paper, not taking very detailed notes and at the end of your efforts you may not have learned much. A much better way to go about your reading is to keep in mind a number of clear, focussed questions and read the paper with the intention of writing down answers to these questions in your notes. That way you will finish with a clear set of notes that you can be confident will be useful to you when you start writing up.</span></p> <p><span style="font-size: small;">I would recommend you use this set of questions to guide your reading:</span></p> <div><ol> <li>What research question were the authors asking?</li> <li>Why did the authors believe that their research question was important?</li> <li>How did the authors go about answering their research question?</li> <li>What results did the authors obtain or, what did the authors learn from answering their research question?</li> </ol></div> <p><span style="font-size: small;">You can find a template for some notes <a href="https://docs.google.com/document/pub?id=1RI5_624eBfZtZUy1Aia7s5VLxaXm4hSS3g5nkSeX2KI" title="Literature review notes template" target="_blank">here</a>.</span></p> <p><strong><span style="font-size: medium;">Making use of your notes</span></strong></p> <p><span style="font-size: medium;"><span style="font-size: small;">When you have finished reading you should have a stack of notes on all the papers you have read. This should be a much more concise way to start writing up than having a much bigger stack of papers and (most likely) not much memory of what was in them! So, the next thing to do is decide on the structure of your literature review chapter. </span></span></p> <p><span style="font-size: medium;"><span style="font-size: small;">The first paragraph of your chapter should introduce the rest of the chapter. This is a good place to remind the reader of your research question and explain how the current chapter relates to it. </span></span></p> <p><span style="font-size: medium;"><span style="font-size: small;">The last paragraph of your chapter should summarise what you have reviewed. This is a good chance to help the reader naviagte around your thesis. Briefly review what you have said in the chapter and refer the reader to the next chapter, explaining how the next chapter follows on from the current one.</span></span></p> <p><span style="font-size: medium;"><span style="font-size: small;">The middle part of the chapter is more difficult and, since your writing will depend on your particular research question and the literature you have read, there isn't much generic advice to be given here. However, you can start by reading through your notes and looking for common themes. Think about how best to present the ideas to a reader who has not read the same literature. Do you want to take the reader chronologically through the literature, from the earliest point to the present day? Would it be easier to understand if you split the reading into particular topics that are related? When you have what you think is a good structure, write some section headings into your thesis and think about which papers go in which sections (of course, some papers may well go into several sections). Write the citations into each section using something like <a href="http://www.endnote.com/" title="EndNote" target="_blank">EndNote</a>, <a href="http://www.mendeley.com/" title="Mendeley" target="_blank">Mendeley</a> or <a href="http://www.bibtex.org/" title="BibTeX" target="_blank">BibTeX</a> to format them for you. Play around with the structure until you are convinced that it will make sense then write in the details of each section. Make sure you check out <a href="http://projectsuccess.posterous.com/top-10-writing-mistakes-made-by-project-stude" title="Top writing mistakes made by project students" target="_blank">this post</a> to help you with your writing.</span></span></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/how-to-read-research-papers">Pass your university project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-63530162591988601952011-10-23T12:55:00.001-07:002011-10-23T12:55:21.351-07:00Why read from primary sources? Or: why reading blog posts is harder, not easier than reading papers<div class='posterous_autopost'><p><span style="font-size: small;">I've been meaning to write this post for a long, long time. Now that I have an enormous pile of marking to get through in double-quick time, I have the perfect excuse for a bit of <a href="http://www.structuredprocrastination.com/" target="_blank">structured procrastination</a>.</span></p> <p><span style="font-size: medium;"><strong>What is a primary source?</strong></span></p> <p><span style="font-size: small;">A <em>primary</em> source, is an original piece of writing, describing some research and written by the person or team who performed that research. A <em>secondary</em> source, is a description or discussion of a piece of research by someone who has read about the research, but did not carry it out themselves. So, if an academic performs an experiment and writes it up as a journal paper, that paper is a primary source. If another researcher then quotes the paper and cites it in one of their papers, then that is a secondary source. Newspaper articles, magazine articles, wikipedia, and most websites and blog pages are secondary sources. When it comes to scientific research, only writing published in peer-reviewed conferences, journals, books and magazines constitutes a primary source.</span></p> <p><span style="font-size: medium;"><strong>What is peer-review and why does it matter?</strong></span></p> <p><span style="font-size: small;">Even if a paper is a primary source describing some research, that doesn't guarantee that the research is rigorous, reliable and high-quality. To ensure that all academic writing meets basic standards of quality assurance, scientists use <em>peer-review</em>. This means that a number of professional scientists (usually two or more) will read through the work carefully, and critique it before it is published. If the work is of very poor quality, or very badly written, it will be rejected and the authors will have to re-write their papers and try to publish them elsewhere. If the work is of a high enough standard to publish, the authors will be given a list of improvements they must make before the paper goes to print. This way, we ensure that inaccurate, incorrect, or incomprehensible work doesn't get published in high quality conferences and journals.</span></p> <p><span style="font-size: medium;"><strong>Why read primary sources?</strong></span></p> <p><span style="font-size: small;">Students often complain about making the leap from reading textbook-style prose to formal, academic research literature. Part of the problem is that the style of writing is different, and takes some getting used to. More deeply, though, students today have likely grown up with the web and with reading informal, secondary sources, making the change is hard work, and nerve-wrecking for some. Why waste hours wading through pages and pages of long-winded, complicated, weirdly-written prose, when you can read a quick, accessible summary on Wikipedia? Well, of course Wikipedia is a good place to start to get a basic overview of an area and help your understanding of the primary sources you are reading. However, it is absolutely essential to read the primary sources themselves. Why? </span></p> <p><span style="font-size: medium;"><strong>Reason 1: secondary sources editorialise</strong></span></p> <p><span style="font-size: small;">A secondary source will describe some parts of the primary source, but not others. The secondary source will take a particular point of view (i.e. the author will voice their own opinion) and will pick the parts of the primary source that are useful for that discussion. This doesn't necessarily mean that the secondary source is particularly biased (although it might be), it's more that secondary sources are selective in what they discuss. For example, if a paper on Web2.0 discusses the implementation, performance and usability of Web2.0 sites, a secondary source on the subject of usability is likely to leave out any mention of implementation and performance. So, by reading secondary sources you miss out on a lot of the detail of the original work and much of that detail may be very important to you and your work.</span></p> <p><span style="font-size: small;">It is probably worth saying that there is an important exception to this: <em>survey papers</em>. A good survey paper should be like an extended literature review that discusses, in some detail, the literature available in a broad area of Comptuer Science. These survey papers are a good place to start when writing your own literature review. You can usually find survey papers in well established journals, or specialist survey journals such as <a href="http://dl.acm.org/citation.cfm?id=J204" title="ACM Computing Surveys" target="_blank">ACM Computing Surveys</a>.</span></p> <p><span style="font-size: medium;"><strong>Reason 2: secondary sources are sometimes wrong</strong></span></p> <p><span style="font-size: small;">Every academic field has a number of ideas which are passed on from one generation to the next with little reference back to the original research that generated those ideas. Be somewhat skeptical about this, most of the time there are good reasons to feel assured that this knowledge is sound, especially in fields where mathematical proof is the main way of advancing the field. However, in more subjective or experimental fields (such as Software Engineering or Usability) results can sometimes be misunderstood or misinterpreted over the years.</span></p> <p><span style="font-size: small;">An example of this is Winston Royce's "Waterfall Method" which (as you probably already know) is a method for organising and planning large programming projects. The central idea in Royce (1970) is very simple and easy to understand: you split the work into a number of different "phases" (requirements gathering, analysis, design, coding, testing, maintenance) and your team performs each phase in turn. There's even a nice image to go with the idea, just to make it nice and easy to understand:</span></p> <p style="text-align: center;"><div class='p_embed p_image_embed'> <img alt="200px-waterfall_model_1" height="150" src="http://posterous.com/getfile/files.posterous.com/temp-2011-10-23/JJzrhBCshCEJlgdlrGchjwIFtszCgbhJJyzsrEiiwwzhArGyirrxbEJcEIsk/200px-Waterfall_model_1.svg.png.scaled500.png" width="200" /> </div> </p> <p style="text-align: center;">Image source: <a href="http://en.wikipedia.org/wiki/File:Waterfall_model_(1).svg" target="_blank">Wikipedia</a></p> <p style="text-align: left;"><span style="font-size: small;">For many people, this is where their understanding of the waterfall model stops. But in Royce's original paper there is a long discussion of the drawbacks of organising a project in this manner In fact Royce says that it is "risky and invites failure" (pp. 329). Moving on, the majority of Royce's paper is a list of changes to the sequential model which make it more workable. Some of these are of particular interest, for example "plan testing" is a step that Royce advocates should go with program design. In modern, more "agile" development methods we would advocate writing unit tests around this time, so Royce is presenting a very modern approach. The last modification Royce makes is to "involve the customer" at several points in the process. Again, a much more modern approach that many authors would say goes with agile or "eXtreme" development methods. </span></p> <p style="text-align: left;"><span style="font-size: small;">The picture Royce paints is not a simple sequential model at all, it's much more complicated than that. Tarmo Toikkanen has written an <a href="http://tarmo.fi/blog/2005/09/dont-draw-diagrams-of-wrong-practices-or-why-people-still-believe-in-the-waterfall-model/" title="Don't draw diagrams of wrong practices – or: Why people still believe in the Waterfall model" target="_blank">interesting blog post</a> on this subject. He speculates that the reason people advocate for the basic waterfall method is that the diagram and analogy make it very easy to understand, so people don't delve any deeper into the details. In fact, </span><span style="font-size: small;">Toikkanen points out that NATO even have a military standard (<a href="http://www.product-lifecycle-management.com/download/DOD-STD-2167A.pdf" title="Defence System Software Development" target="_blank">DOD-STD-2167</a>) based on Royce's work. <em>[Aside: If you wanted to test </em></span><span style="font-size: small;"><em>Toikkanen's idea that it's the diagram in Royce's paper that leads to the misunderstanding, what experiment would you devise to test that idea?]</em></span></p> <p style="text-align: left;"><span style="font-size: small;">More parochially, we often see University students writing something like "in my project I will use the Waterfall Method" sometimes even with a citation. DON'T DO THIS! Read Royce (1970) in full, understand what he's really arguing for, then use a more modern method, or at least use Royce's iterative method found at the end of the paper.</span></p> <p style="text-align: left;"><strong style="font-size: medium;">Reason 3: different primary sources may disagree</strong></p> <p><span style="font-size: small;">Research is all about creating and discovering new ideas. Very often primary sources disagree on how best to do that, or they have competing ideas and only through years of research and discussion does a consensus evolve. There are examples of this throughout the history of science. Whether it's the flat Earth debate, Big Bang <em>vs.</em> the Steady State theory, structured programming <em>vs.</em> object oriented programming, through debate, reason, mathematical arguments, prototype systems, models, simulation and all sorts of other techniques, the history of science is full of arguments and competing ideas.</span></p> <p><span style="font-size: small;">When you read a secondary source, very often whatever "debate" has taken place is already in the past and the author of the secondary source will simply describe the consensus that has since been reached. For example, there were many good reasons for cosmologists to believe in the steady state theory before evidence for the Big Bang became overwhelming. Only by going back to this litereature can we see how the debate unfolded and why the evidence that supported the Big Bang (to do with background microwave radiation in the cosmos which was discovered in the 1960s) was so convincing.</span></p> <p><span style="font-size: small;">In Computer Science there are also many of these debates. For example, most proframming languages do not have a "goto" statement. In fact, Java has a keyword called "goto", but it is <a href="http://download.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html" title="Java language keywords" target="_blank">not used</a>. In the late 1960s and 70s there was a heated debate about whether "goto" was a safe and useful construct and you can read through that debate in Dijkstra (1968), Knuth (1974) and plenty of other sources. Without going back to these papers, which were written well before the debate was settled, can you fully understand the arguments that, eventually, banished the "goto" statement from most modern languages.</span></p> <p><span style="font-size: medium;"><strong>Conclusions: reading blog posts is harder than reading papers</strong></span></p> <p><span style="font-size: small;">So, why did I say in the title of this post that reading blog posts is "harder" than reading papers? Actually reading blog posts may be easier, but in terms of getting a good grade in your project you are unlikely to produce a high quality literature review based on blog posts. Blogs will tend to be selective and biased in their nature. This isn't a criticism of blogs, far from it, blogs are a great place for lively debates. They aren't such a great place, necessarily, to descibe careful, peer-reviewed research in great detail -- that's best left for conferences and journals.</span></p> <p><span style="font-size: medium;"><strong>References</strong></span></p> <p><span style="font-size: medium;"> </span></p> <div style="background-color: transparent;"><span style="font-size: small;"><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Edsger W. Dijkstra (1968) Letters to the editor: </span><a href="http://www.cs.utexas.edu/~EWD/ewd02xx/EWD215.PDF" target="_blank" style="font-family: Bitstream Vera Sans;"><span style="font-family: Arial; color: #000099; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline;">Goto statement considered harmful.</span></a><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"> Communications of the ACM 11, 3 (March 1968), 147-148. DOI=10.1145/362929.362947 </span><a href="http://doi.acm.org/10.1145/362929.362947" target="_blank" style="font-family: Bitstream Vera Sans;"><span style="font-family: Arial; color: #000099; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline;">http://doi.acm.org/10.1145/362929.362947</span></a><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;"> </span></span><p /><span style="font-size: small;"><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">Donald E. Knuth (1974). </span><a href="http://pplab.snu.ac.kr/courses/adv_pl05/papers/p261-knuth.pdf" target="_blank" style="font-family: Bitstream Vera Sans;"><span style="font-family: Arial; color: #000099; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline;">Structured Programming with goto Statements</span></a><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline;">. ACM Computing Surveys 6, 4 (December 1974), 261-301. DOI=10.1145/356635.356640 </span><a href="http://doi.acm.org/10.1145/356635.356640" target="_blank" style="font-family: Bitstream Vera Sans;"><span style="font-family: Arial; color: #000099; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline;">http://doi.acm.org/10.1145/356635.356640</span></a></span><p /><span style="font-family: Arial; color: #000000; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: none; vertical-align: baseline; font-size: small;"><span style="font-family: Arial, sans-serif;">Royce, W. Winston (1970), </span></span><span style="font-size: small;"><span style="font-family: Arial; color: #000099; background-color: transparent; font-style: normal; font-variant: normal; text-decoration: underline; vertical-align: baseline;"><a href="http://www.cs.umd.edu/class/spring2003/cmsc838p/Process/waterfall.pdf" title="Managing the development of large software systems" target="_blank" style="font-family: Bitstream Vera Sans;">Managing the development of large software systems: concepts and techniques</a></span></span><span style="font-family: Arial, sans-serif; font-size: small;"> In p<em>roceedings of IEEE WESTCON, Los Angeles</em> , 1--9 .</span></div> <ol> </ol> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/why-read-from-primary-sources-or-why-reading">Pass your university project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-45849394622751990272011-05-22T15:13:00.001-07:002011-05-22T15:13:09.001-07:00First Pachube Hackathon #pachubehack<div class='posterous_autopost'><p>The start of April saw the first <a href="http://www.pachube.com/" title="Pachube website" target="_blank">Pachube</a> (pronounced "Patch Bay") hackathon in London, Lancaster, New York, Eindoven, Linz and Zurich. Pachube is doing some very interesting and innovative work quite closely aligned to some of the Internet of Things research we are doing in Wolverhampton.</p> <p>The London event was great fun, and the nice folks at <a href="http://www.01zero-one.co.uk/" title="01zero-one" target="_blank">01zero-one</a> kept us going through the night with pleanty of coffee and pizza -- geek fuel! It was good to meet up with some old friends and make some new ones. Our former student from Coventry, and first <a href="http://www.nuffieldfoundation.org/undergraduate-research-bursaries-0" title="Nuffield Foundation Undergraduate Science Bursaries" target="_blank">Nuffield Bursar</a> <a href="http://timchurchard.me.uk/" title="Tim Churchard" target="_blank">Tim Churchard</a> is now a founder at <a href="http://ignotoconsulting.com/" title="Ignoto Consulting" target="_blank">Ignoto Consulting</a> and doing some excellent work in embedded systems design. Great to see one of our graduates doing so well in the current economic climate. It was also interesting to meet <a href="http://samthetechie.org.uk/" title="Sam the Techie" target="_blank">Sam the Techie</a>, who I've followed on twitter for a while now. Sam is the brains behind the now famous <a href="http://sukey.org/" title="Sukey" target="_blank">Sukey</a> app, which keeps demonstrators in touch with one another in real time. <a href="http://sukey.org/" title="Sukey" target="_blank">Sukey</a> is probably one of the few IoT apps that has really been used in earnest by large numbers of end-users and it's a great example of putting online data to real use. The folks behind <a href="http://sustburbia.blogspot.com/2011/04/pachube-hackathon-nanodes-first-outing.html" title="Nanode" target="_blank">Nanode</a> were also there, making good progress on their web-enabled Arduino board, which looks like it's going to be a great boost to hobbyist hackers. You can sign up to purchase one of the first runs of the board on the <a href="http://wiki.hackspace.org.uk/wiki/Project:Nanode" title="Nanode site" target="_blank">London Hackspace wiki</a>.</p> <p>The hackathon itself produced some really interesting applications. <a href="http://rainycatz.wordpress.com/2011/04/11/temperature-sensing-t-shirt-aka-%E2%80%9Cyr-in-mah-face%E2%80%9D/" title="Rainycat blog" target="_blank">Rainycat</a> came up with a great wearable based on the Arduino Lilypad called <strong>Yr in Ma Face!</strong> which discourages people from invading your personal space. I'd imagine it would go crazy on the London Tube network.</p> <p><a href="http://www.flickr.com/photos/sarahmount/5748231230"><img class="posterous_download_image" src="http://farm3.static.flickr.com/2802/5748231230_a9fa65470f.jpg" border="0" height="375" width="500" /></a></p> <p>There was a great RFID app called Display Case which coupled simple real-world avatars with a vertical projector and real-time information:</p> <p><a href="http://www.flickr.com/photos/sarahmount/5609922390"><img class="posterous_download_image" src="http://farm6.static.flickr.com/5230/5609922390_9c0ed7d810.jpg" border="0" height="375" width="500" /></a></p> <p>The Nanode guys made quite a bit of progress and the Arkessa team came up with a nice Arduino hack to produce "banana graphs" with a Lego NXT (warning: charts may not be to scale :P):</p> <p><a href="http://www.flickr.com/photos/sarahmount/5747681839"><img class="posterous_download_image" src="http://farm6.static.flickr.com/5101/5747681839_b791d6ba1c.jpg" border="0" height="375" width="500" /></a></p> <p>and we had a wifi-enabled umbrella, much like the <a href="http://www.senzumbrellas.com/" title="Senz Umbrellas" target="_blank">Senz Umbrella</a>, although possibly more likely to electrocute its users!</p> <p><a href="http://www.flickr.com/photos/sarahmount/5748232932"><img class="posterous_download_image" src="http://farm3.static.flickr.com/2208/5748232932_c578262cae.jpg" border="0" height="375" width="500" /></a></p> <p>My own offering was Marvin the Paranoid Android, which Usman <a href="http://blog.pachube.com/2011/04/internet-of-things-hackathon-result.html" title="Pachube blog" target="_blank">very kindly described as "inspiring"</a>. Marvin is an attempt to create an <em>affective</em> interface out of some ostensibly boring data -- the temperature, remaining battery power, and so on from my laptop. Affective interfaces are ones designed to elicit emotions from their users, and to my mind, that's an important part of making the Internet of Things useful, and more than just a technical concern. Marvin is a chatbot interface, in the style of <a href="http://en.wikipedia.org/wiki/Marvin_the_Paranoid_Android" title="Marvin the Paranoid Android" target="_blank">Marvin the Paranoid Android</a> of Douglas Adams fame. You can find the data that feeds Marvin <a href="http://www.pachube.com/feeds/22344" title="Marvin's data" target="_blank">here</a> and the chat interface itself is hosted <a href="http://pachubelaptop.appspot.com/" title="Marvin the Paranoid Laptop" target="_blank">here</a>. The AI still needs a lot of work to be really usable, but you can already have suitably patronising and miserable conversations with Marvin, like this one:</p> <p> </p> <p style="padding-left: 30px;"><strong>Puny human:</strong> hi marvin</p> <p style="padding-left: 30px;"><strong>Marvin:</strong> Life, loathe it or ignore it, you can't like it.</p> <p style="padding-left: 30px;"><strong>Puny human:</strong> what is your status</p> <p style="padding-left: 30px;"><strong>Marvin:</strong> Current battery capacity is 57667mWh out of a capacity of 57667mWh that's 100% Currently at 56.0C. When I get to 107.0 I blow up. Currently working at 118.0% load. Call that reasonable working conditions? I don't.</p> <p style="padding-left: 30px;"> </p> <p>Rain said to me during the day "if you don't document things, you lose them", and that's something I'm slowly trying to learn. This time around I made a simple slide deck to remind myself how the Marvin system worked, hopefully I'll slowly get better at documenting this sort of work, although the fact that this blog post has come out so long after the hackathon shows I've got a way to go yet!</p> <p><object height="417" width="500"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=marvintheparanoidlaptopbyhisownersnim2-110409064605-phpapp02&stripped_title=marvin-the-paranoid-laptop-by-his-owner-snim2" /> <param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /> <embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=marvintheparanoidlaptopbyhisownersnim2-110409064605-phpapp02&stripped_title=marvin-the-paranoid-laptop-by-his-owner-snim2" allowfullscreen="true" type="application/x-shockwave-flash" allowscriptaccess="always" height="417" width="500"></embed> </object></p> <p> </p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/first-pachube-hackathon-pachubehack">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-40559756354207935502011-03-24T03:07:00.001-07:002011-03-24T03:07:53.447-07:00Why I will not be on strike with @UCU today #ucustrike<div class='posterous_autopost'><p>Today, the University and College union UCU are holding a strike relating to pensions and pay. If you want to read a good exposition of why lecturers and support staff have voted for this, Phil Wadler <a href="http://wadler.blogspot.com/2011/03/why-i-am-on-strike.html">has written an excellent piece</a> and UCU have an <a href="http://www.ucu.org.uk/media/pdf/5/1/tps_whywerestrikingleaflet.pdf">official announcement</a> [PDF warning]. As always, there's an active <a href="http://twitter.com/#!/search/%23ucustrike">Twitter stream</a> on the action. Of course, any academic should tell you that it's a good idea to read both sides of any story, so do go and look.</p> <p>Our own chapter of the student union have <a href="http://www.wolvesunion.org/news/article/6001/310/">an announcement</a> on why they will not be supporting striking lecturers today and, with great reluctance, I will be in agreement with the SU and crossing the picket line, although for rather different reasons than the SU have cited.</p> <p>This is a tumultuous time for Higher Education in the UK and we have been recently hit with several, potentially very detrimental, policies from government. These include:</p> <ul> <li>increasing the level of fees and creating a fees economy at a time when many young people could not hope to gain a job after secondary school because of the global financial recession, leaving many young people with very few life options after their compulsory education has ended;</li> <li>maintaining the tight quotas and financial penalties for breaching quotas on "home" (UK/EU) students whilst making it more difficult for (uncapped) overseas students to get visas (and so maintaining the odd situation that a University is fined by the government for being popular with students). This is a major problem as most universities already have to spend more to teach students than they get from HEFCE. At the very least, most academics work between sixty and eighty hours a week, so the wages bill for academics is really close to twice the figure on the balance sheets. Most lecturers would rather be offering students more and better tuition when they start to pay full fees, rather than being squeezed by finances into providing less;</li> <li>deregulating the tight restraints on which institutions may award degrees and opening the way for non-research based organisations such as <a href="http://www.bbc.co.uk/news/education-11990787">publishing houses to grants degree titles</a>, and</li> <li>limiting teaching and research funding, especially for the arts and humanities. </li> </ul> <p>With such huge threats to the excellent reputation that UK higher education has around the world, you might be forgiven for thinking that there is plenty for UCU to strike over. I would certainly agree, but in a time when we are expecting students to contribute ever more to their own education, to strike over our own pensions and pay seems petty, puerile and selfish and I cannot bring myself to support it.</p> <p>At this time we in academic and UCU in particular desperately need to effectively communicate the value -- both the economic value and the social capital -- that Universities contribute to national life. We need to argue that the <a href="http://www.newmanreader.org/works/idea/">idea of a university</a> still means something. That students deserve to be taught by true experts in their fields. That the idea of the University to <a href="http://education.guardian.co.uk/thegreatdebate/story/0,9860,574645,00.html">train the next generation of factory workers</a> is not acceptable and University should offer more to students than a chance at a job interview, but be an <a href="http://www.imprint.co.uk/books/maskell.html">education for life</a>. To my mind, by taking this very limited, selfish strike action at such a crucial time we have lost any moral high-ground with the government and any real opportunity to communicate our message effectively to the public. In years to come, we will look back at this day and say this was the beginning of the end. What a shame.</p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/why-i-will-not-be-on-strike-with-ucu-today-uc">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-47235635480023956602010-11-14T14:07:00.001-08:002010-11-14T14:07:36.340-08:00Open Source Development in Malawi<div class='posterous_autopost'> <object height="363" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="500"> <param name="movie" value="http://prezi.com/bin/preziloader.swf" /> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="bgcolor" value="#ffffff" /> <param name="flashvars" value="prezi_id=dccbdcllkrmo&lock_to_path=0&color=ffffff&autoplay=no&autohide_ctrls=0" /><embed src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" height="363" flashvars="prezi_id=dccbdcllkrmo&lock_to_path=0&color=ffffff&autoplay=no&autohide_ctrls=0" width="500"></embed> </object> <div class="prezi-player-links"> <p><a href="http://prezi.com/dccbdcllkrmo/open-source-development-in-malawi/" title="An overview of the open-ihm project.">Open Source Development in Malawi</a> on <a href="http://prezi.com">Prezi</a></p> </div> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/open-source-development-in-malawi">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-29768881555737332182010-11-09T19:00:00.001-08:002010-11-09T19:00:03.515-08:00Experiments: why and how<div class='posterous_autopost'> <object height="363" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="500"> <param name="movie" value="http://prezi.com/bin/preziloader.swf" /> <param name="allowfullscreen" value="true" /> <param name="allowscriptaccess" value="always" /> <param name="bgcolor" value="#ffffff" /> <param name="flashvars" value="prezi_id=jbynibv6kxqc&lock_to_path=0&color=ffffff&autoplay=no&autohide_ctrls=0" /><embed src="http://prezi.com/bin/preziloader.swf" type="application/x-shockwave-flash" height="363" flashvars="prezi_id=jbynibv6kxqc&lock_to_path=0&color=ffffff&autoplay=no&autohide_ctrls=0" width="500"></embed> </object> <div class="prezi-player-links"> <p><a href="http://prezi.com/jbynibv6kxqc/experiments-why-and-how/" title="Brief talk on experiments for project students">Experiments: why and how</a> on <a href="http://prezi.com">Prezi</a></p> </div> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/experiments-why-and-how">Pass your final year project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-26781474624814010772010-11-04T08:34:00.001-07:002010-11-04T08:34:29.208-07:00Top 5 writing mistakes made by project students<div class='posterous_autopost'><p><a href="http://www.flickr.com/photos/athena/325752626/"><img class="posterous_download_image" src="http://farm1.static.flickr.com/138/325752626_69392aa6b1.jpg" border="0" height="375" width="500" /></a></p> <p>A large part of any final year thesis project is the write-up, but every stage of the project will involve some form of writing. Whether you are writing a proposal, an interim report, a draft report, documentation or the final thesis, a very large part of your time will be spent composing text. These are the top ten mistakes we see from students year on year, avoid them and you can save yourself a lot of time (and earn a lot of marks)...</p> <p> </p> <p><span style="font-size: medium;"><strong>1. Unsubstantiated claims</strong></span></p> <p>As a general rule, any statement of fact or opinion about your work, or your topic of study should be substantiated in some way. You don't have to worry about the bleeding obvious, we know that 1+1=2 (unless your work is in the "foundations" of mathematics or philosophy, in which case 1+1 may well be undefined), but anything less obvious should be backed up by solid evidence. That evidence can be a reference to literature, an argument you make in your writing, the results of your own experiments, or any other suitably rigorous evidence.</p> <p>Avoid so-called <em>sweeping</em> statements that are effectively impossible to substantiate "all Object Oriented programs couple algorithms and data". Do they? All of them? "Testing improves the performance of students". Really? These sorts of claims are poor academic practice and suggest that you have been a little sloppy in your thinking about your work, and of course that's not the impression you want to give.</p> <p> </p> <p><span style="font-size: medium;"><strong>2. Dangling pronouns and other references</strong></span></p> <p><span style="font-size: medium;"> </span><span style="font-size: medium;"><span style="font-size: 13px;">This seems to be an almost universal problem with student writing. Consider the following paragraph:</span></span></p> <p style="padding-left: 30px;"><span style="font-size: medium;"><span style="font-size: 13px;"><em>In his 1953 paper, Henry Gordon Rice proved that for any non-trivial property of a partial function there is no general decision method to determine an algorithm that computes a partial function with that property. It has far reaching consequences for compilers, static analysis and other fields in practical computing.</em></span></span></p> <p><span style="font-size: medium;"><span style="font-size: 13px;">What does the "It" in the second sentence refer to? Rice's theorem, his paper, or something else? It isn't clear from the text, although we can guess that the author meant to discuss the theorem. Better though, to be clear about the meaning in the first place. Every pronoun ("I", "he", "she", "it", "that", "who", etc.) should clearly refer to exactly one noun. The first sentence gets this right, it is clear that "his" refers to the noun "Henry Gordon Rice" and not any other noun in that sentence. S</span></span>o, we could improve the paragraph above by re-writing it:</p> <p style="padding-left: 30px;"><em>In his 1953 paper, Henry Gordon Rice proved that for any non-trivial property of a partial function there is no general decision method to determine an algorithm that computes a partial function with that property. Rice's theorem has far reaching consequences for compilers, static analysis and other fields in practical computing.</em></p> <p> </p> <p><span style="font-size: medium;"><strong>3. Using a secondary source rather than a primary one</strong></span></p> <p>It's much easier to read the popular press, blogs and other "informal" media than research papers. Very few marks will be awarded for this, though. In a final year project you need to show that you can perform a small academic study, so marks will be available for reading peer-reviewed academic literature. There are two major pitfalls to avoid here. Firstly, you will occasionally come across some disreputable conference or journal which does not use peer-review. Worse, it is possible to come across "articles" on the Internet which have citations and publishing records and look, to all intents and purposes, like a genuine piece of academic writing, but have actually never been submitted to a journal or conference. This is very poor practice on the part of anyone who puts this kind of thing up on their own blog or website, but it does occasionally happen. A reputable publishing venue will have some sort of statement on their website stating how articles are reviewed (look for "Instructions to Authors"). This should say that every article is reviewed by at least two people and sent back for corrections before being published. Without this sort of peer-review any poor standard of work can be "published" without anyone checking even basic standard of good practice, such as detecting plagiarism. That said, even with peer-review, <a href="http://pdos.csail.mit.edu/scigen/#examples">some poor practice still slips through the net</a>.</p> <p>Secondly, whatever references you cite should be <em>primary</em>, rather than <em>secondary</em> sources. A primary source is one where the author(s) reports work that s/he (they) have personally carried out. A<em> </em>secondary source is one where an author reports on work that someone else has completed and published elsewhere. Secondary sources include news reports, magazine articles and blog posts about research completed by others.</p> <p> </p> <p><span style="font-size: medium;"><strong>4. Confusing structure and use before definition</strong></span></p> <p><span style="font-size: medium;"><span style="font-size: 13px;">Any academic writing should generally be written for a reader who is an expert in the general field of the study, but not necessarily in the specific area of the study. If, for example, your final year project is on genetic algorithms, your work might be marked by an expert in artificial intelligence, or in computer science generally, but not necessarily by an expert in GAs. So, write with that in mind, and make sure that you don't use any specific technical terms without defining them. This is often very difficult to get right at first, especially when you have been working with your own ideas for a very long time. A good plan is to swap drafts of your work with a fellow student who is on the same degree course but working in a completely different field for their final year project. If you can both understand each others work, that's fine. If not, make changes.</span></span></p> <p><span style="font-size: medium;"><span style="font-size: 13px;"><br /></span></span></p> <p><span style="font-size: medium;"><strong>5. Claims of "proof"</strong></span></p> <p><span style="font-size: medium;"><span style="font-size: 13px;">At the beginning and end of your dissertation you will want to set out the aims of your work and describe the conclusions you have reached. Occasionally we see students writing sentences such as "this study proves that ...", "this thesis will prove ...", and so on. "Proof" is specifically a mathematical method, and if you have genuinely proven a theorem, by all means say so. If not, then don't use the word "prove" and be <em>very</em> careful about what you do claim. For example ...</span></span></p> <ul> <li>If you have tested a piece of software and it has passed all your test cases, then you have shown that your software is free of the specific errors you have checked for. You have not shown that it is "error-free" or "works".</li> <li>If you have performed some sort of user testing, or any other usability / accessibility testing, then you may have demonstrated that the system under study is "usable" or "accessible" as far as you have tested it. However, without a large-scale study that is as much as you can claim. Be <strong>very</strong> circumspect about reading research in the area of usability; there is much good research but also much which is over-blown. Be especially careful of authors who also run consultancy practices, make sure you cite their academic literature, and not anything that could be considered advertising. Make sure everything you cite is peer-reviewed.</li> <li>Be very, very careful about using questionnaires. I usually tell all my students to just avoid them altogether. It is very, very hard to produce a questionnaire which holds up under academic scrutiny and you will need an amount of statistical sophistication to produce sensible results. Also, you need a very large sample-size because your questions will be circumscribed (and for other reasons). This makes questionnaires very difficult to use in short, single-person projects. If you are in any doubt, then use a "semi-structured interview" to interview test subjects and the "talk-aloud protocol" or "cognitive dimensions of notation" for usability testing. Before you start, read some papers on evaluation methods, such as Hollingsed and Novick (2007) Usability Inspection Methods after 15 Years of Research and Practice, or Hornbaek and Law (2007) Meta-Analysis of Correlations Among Usability Measures.</li> </ul> <p> </p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/top-10-writing-mistakes-made-by-project-stude">Pass your final year project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-48005711164221880622010-10-19T09:44:00.001-07:002010-10-19T09:44:41.975-07:00Adding a minimal online interface to an imified.com chatbot<div class='posterous_autopost'><p>Recently, the people who brought you the excellent <a href="http://imified.com/">imified</a> service, for creating IM bots, brought out <a href="http://phono.com">phono</a>, a simple JQuery interface to phone and IM services. Using Phono, you can create a simple front-end to an IMIFIED bot. The following code does this; you will need to replace the string <strong><a href="mailto:MYBOT@bot.im">MYBOT@bot.im</a></strong> with the address of your own bot, and you will need a free API key from <a href="http://phono.com">phono</a> to make this work.</p> <p><div class="data type-html"> <table cellspacing="0" cellpadding="0"> <tr> <td> <pre class="line_numbers"><span rel="#L1" id="LID1">1</span> <span rel="#L2" id="LID2">2</span> <span rel="#L3" id="LID3">3</span> <span rel="#L4" id="LID4">4</span> <span rel="#L5" id="LID5">5</span> <span rel="#L6" id="LID6">6</span> <span rel="#L7" id="LID7">7</span> <span rel="#L8" id="LID8">8</span> <span rel="#L9" id="LID9">9</span> <span rel="#L10" id="LID10">10</span> <span rel="#L11" id="LID11">11</span> <span rel="#L12" id="LID12">12</span> <span rel="#L13" id="LID13">13</span> <span rel="#L14" id="LID14">14</span> <span rel="#L15" id="LID15">15</span> <span rel="#L16" id="LID16">16</span> <span rel="#L17" id="LID17">17</span> <span rel="#L18" id="LID18">18</span> <span rel="#L19" id="LID19">19</span> <span rel="#L20" id="LID20">20</span> <span rel="#L21" id="LID21">21</span> <span rel="#L22" id="LID22">22</span> <span rel="#L23" id="LID23">23</span> <span rel="#L24" id="LID24">24</span> <span rel="#L25" id="LID25">25</span> <span rel="#L26" id="LID26">26</span> <span rel="#L27" id="LID27">27</span> <span rel="#L28" id="LID28">28</span> <span rel="#L29" id="LID29">29</span> <span rel="#L30" id="LID30">30</span> <span rel="#L31" id="LID31">31</span> <span rel="#L32" id="LID32">32</span> <span rel="#L33" id="LID33">33</span> <span rel="#L34" id="LID34">34</span> <span rel="#L35" id="LID35">35</span> <span rel="#L36" id="LID36">36</span> <span rel="#L37" id="LID37">37</span> <span rel="#L38" id="LID38">38</span> <span rel="#L39" id="LID39">39</span> <span rel="#L40" id="LID40">40</span> <span rel="#L41" id="LID41">41</span> <span rel="#L42" id="LID42">42</span> <span rel="#L43" id="LID43">43</span> <span rel="#L44" id="LID44">44</span> <span rel="#L45" id="LID45">45</span> <span rel="#L46" id="LID46">46</span> <span rel="#L47" id="LID47">47</span> <span rel="#L48" id="LID48">48</span> <span rel="#L49" id="LID49">49</span> <span rel="#L50" id="LID50">50</span> <span rel="#L51" id="LID51">51</span> <span rel="#L52" id="LID52">52</span> <span rel="#L53" id="LID53">53</span> <span rel="#L54" id="LID54">54</span> <span rel="#L55" id="LID55">55</span> <span rel="#L56" id="LID56">56</span> <span rel="#L57" id="LID57">57</span> <span rel="#L58" id="LID58">58</span> <span rel="#L59" id="LID59">59</span> <span rel="#L60" id="LID60">60</span> <span rel="#L61" id="LID61">61</span> <span rel="#L62" id="LID62">62</span> <span rel="#L63" id="LID63">63</span> <span rel="#L64" id="LID64">64</span> <span rel="#L65" id="LID65">65</span> <span rel="#L66" id="LID66">66</span> <span rel="#L67" id="LID67">67</span> <span rel="#L68" id="LID68">68</span> <span rel="#L69" id="LID69">69</span> <span rel="#L70" id="LID70">70</span> <span rel="#L71" id="LID71">71</span> <span rel="#L72" id="LID72">72</span> <span rel="#L73" id="LID73">73</span> <span rel="#L74" id="LID74">74</span> <span rel="#L75" id="LID75">75</span> <span rel="#L76" id="LID76">76</span> <span rel="#L77" id="LID77">77</span> <span rel="#L78" id="LID78">78</span> <span rel="#L79" id="LID79">79</span> <span rel="#L80" id="LID80">80</span> <span rel="#L81" id="LID81">81</span> <span rel="#L82" id="LID82">82</span> <span rel="#L83" id="LID83">83</span> <span rel="#L84" id="LID84">84</span> <span rel="#L85" id="LID85">85</span> <span rel="#L86" id="LID86">86</span> <span rel="#L87" id="LID87">87</span> <span rel="#L88" id="LID88">88</span> <span rel="#L89" id="LID89">89</span> <span rel="#L90" id="LID90">90</span> <span rel="#L91" id="LID91">91</span> <span rel="#L92" id="LID92">92</span> <span rel="#L93" id="LID93">93</span> <span rel="#L94" id="LID94">94</span> <span rel="#L95" id="LID95">95</span> <span rel="#L96" id="LID96">96</span> <span rel="#L97" id="LID97">97</span> <span rel="#L98" id="LID98">98</span> <span rel="#L99" id="LID99">99</span> <span rel="#L100" id="LID100">100</span> <span rel="#L101" id="LID101">101</span> <span rel="#L102" id="LID102">102</span> <span rel="#L103" id="LID103">103</span> <span rel="#L104" id="LID104">104</span> <span rel="#L105" id="LID105">105</span> <span rel="#L106" id="LID106">106</span> <span rel="#L107" id="LID107">107</span> <span rel="#L108" id="LID108">108</span> <span rel="#L109" id="LID109">109</span> <span rel="#L110" id="LID110">110</span> <span rel="#L111" id="LID111">111</span> <span rel="#L112" id="LID112">112</span> <span rel="#L113" id="LID113">113</span> <span rel="#L114" id="LID114">114</span> <span rel="#L115" id="LID115">115</span> <span rel="#L116" id="LID116">116</span> <span rel="#L117" id="LID117">117</span> <span rel="#L118" id="LID118">118</span> <span rel="#L119" id="LID119">119</span> <span rel="#L120" id="LID120">120</span> <span rel="#L121" id="LID121">121</span> <span rel="#L122" id="LID122">122</span> <span rel="#L123" id="LID123">123</span> <span rel="#L124" id="LID124">124</span> <span rel="#L125" id="LID125">125</span> <span rel="#L126" id="LID126">126</span> <span rel="#L127" id="LID127">127</span> <span rel="#L128" id="LID128">128</span> <span rel="#L129" id="LID129">129</span> <span rel="#L130" id="LID130">130</span> <span rel="#L131" id="LID131">131</span> <span rel="#L132" id="LID132">132</span> <span rel="#L133" id="LID133">133</span> <span rel="#L134" id="LID134">134</span> <span rel="#L135" id="LID135">135</span> <span rel="#L136" id="LID136">136</span> <span rel="#L137" id="LID137">137</span> <span rel="#L138" id="LID138">138</span> <span rel="#L139" id="LID139">139</span> <span rel="#L140" id="LID140">140</span> <span rel="#L141" id="LID141">141</span> </pre> </td> <td width="100%"> <div class="highlight"><pre /><div class="line" id="LC1"><span class="cp"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></span> </div><div class="line" id="LC2"> </div><div class="line" id="LC3"><span class="nt"><html</span> <span class="na">xmlns=</span><span class="s">"http://www.w3.org/1999/xhtml"</span> <span class="na">xml:lang=</span><span class="s">"en"</span><span class="nt">></span> </div><div class="line" id="LC4"> <span class="nt"><head></span> </div><div class="line" id="LC5"> <span class="nt"><title></span>Live chat example<span class="nt"></title></span> </div><div class="line" id="LC6"> <span class="nt"><meta</span> <span class="na">http-equiv=</span><span class="s">"Content-Type"</span> <span class="na">content=</span><span class="s">"text/html; charset=utf-8"</span> <span class="nt">/></span> </div><div class="line" id="LC7"> <span class="nt"><meta</span> <span class="na">name=</span><span class="s">"robots"</span> <span class="na">content=</span><span class="s">"All"</span> <span class="nt">/></span> </div><div class="line" id="LC8"> <span class="nt"><meta</span> <span class="na">name=</span><span class="s">"copyright"</span> <span class="na">content=</span><span class="s">"University of Wolverhampton"</span> <span class="nt">/></span> </div><div class="line" id="LC9"> <span class="nt"><link</span> <span class="na">id=</span><span class="s">"theme"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span> <span class="na">href=</span><span class="s">"/css/style.css"</span> <span class="na">title=</span><span class="s">"theme"</span> <span class="nt">/></span> </div><div class="line" id="LC10"><br /></div><div class="line" id="LC11"> <span class="nt"><style </span><span class="na">type=</span><span class="s">"text/css"</span><span class="nt">></span></div><div class="line" id="LC12"><span class="nt">form</span> <span class="p">{</span></div><div class="line" id="LC13"> <span class="k">width</span><span class="o">:</span> <span class="m">700px</span><span class="p">;</span></div><div class="line" id="LC14"> <span class="k">color</span><span class="o">:</span> <span class="m">#3E4A49</span><span class="p">;</span></div><div class="line" id="LC15"> <span class="k">background-color</span><span class="o">:</span> <span class="m">#EEEEEE</span><span class="p">;</span></div><div class="line" id="LC16"> <span class="k">padding</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span></div><div class="line" id="LC17"> <span class="k">margin</span><span class="o">:</span> <span class="m">20px</span><span class="p">;</span></div><div class="line" id="LC18"><span class="p">}</span></div><div class="line" id="LC19"> </div><div class="line" id="LC20"><br /></div><div class="line" id="LC21"><span class="nt">fieldset</span> <span class="p">{</span></div><div class="line" id="LC22"> <span class="k">padding</span><span class="o">:</span> <span class="m">0</span> <span class="m">20px</span> <span class="m">20px</span><span class="p">;</span></div><div class="line" id="LC23"> <span class="k">margin</span><span class="o">:</span> <span class="m">0</span> <span class="m">0</span> <span class="m">20px</span><span class="p">;</span></div><div class="line" id="LC24"> <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="m">#3E4A49</span><span class="p">;</span></div><div class="line" id="LC25"><span class="p">}</span></div><div class="line" id="LC26"> </div><div class="line" id="LC27"><br /></div><div class="line" id="LC28"><span class="nt">legend</span> <span class="p">{</span></div><div class="line" id="LC29"> <span class="k">color</span><span class="o">:</span> <span class="m">#FFFFFF</span><span class="p">;</span></div><div class="line" id="LC30"> <span class="k">background-color</span><span class="o">:</span> <span class="m">#444444</span><span class="p">;</span></div><div class="line" id="LC31"> <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span></div><div class="line" id="LC32"> <span class="k">padding</span><span class="o">:</span> <span class="m">5px</span><span class="p">;</span></div><div class="line" id="LC33"> <span class="k">margin-bottom</span><span class="o">:</span> <span class="m">0</span><span class="p">;</span></div><div class="line" id="LC34"> <span class="k">width</span><span class="o">:</span> <span class="m">200px</span><span class="p">;</span></div><div class="line" id="LC35"> <span class="k">border</span><span class="o">:</span> <span class="m">1px</span> <span class="k">solid</span> <span class="m">#3E4A49</span><span class="p">;</span></div><div class="line" id="LC36"><span class="p">}</span></div><div class="line" id="LC37"> </div><div class="line" id="LC38"><span class="nt">label</span> <span class="p">{</span></div><div class="line" id="LC39"> <span class="k">display</span><span class="o">:</span> <span class="k">block</span><span class="p">;</span></div><div class="line" id="LC40"> <span class="k">float</span><span class="o">:</span> <span class="k">left</span><span class="p">;</span></div><div class="line" id="LC41"> <span class="k">text-align</span><span class="o">:</span> <span class="k">right</span><span class="p">;</span></div><div class="line" id="LC42"> <span class="k">width</span><span class="o">:</span> <span class="m">100px</span><span class="p">;</span></div><div class="line" id="LC43"> <span class="k">font-weight</span><span class="o">:</span> <span class="k">bold</span><span class="p">;</span></div><div class="line" id="LC44"> <span class="k">margin-right</span><span class="o">:</span> <span class="m">10px</span><span class="p">;</span></div><div class="line" id="LC45"><span class="p">}</span></div><div class="line" id="LC46"> </div><div class="line" id="LC47"><span class="nf">#buttons</span> <span class="p">{</span></div><div class="line" id="LC48"> <span class="k">text-align</span><span class="o">:</span> <span class="k">right</span><span class="p">;</span></div><div class="line" id="LC49"> <span class="k">margin</span><span class="o">:</span> <span class="m">-15px</span> <span class="m">0</span> <span class="m">-5px</span> <span class="m">0</span><span class="p">;</span></div><div class="line" id="LC50"><span class="p">}</span></div><div class="line" id="LC51"> </div><div class="line" id="LC52"><span class="nt">input</span><span class="nc">.button</span> <span class="p">{</span></div><div class="line" id="LC53"> <span class="k">width</span><span class="o">:</span> <span class="k">auto</span><span class="p">;</span></div><div class="line" id="LC54"> <span class="k">background</span><span class="o">:</span> <span class="m">#FFFFFF</span><span class="p">;</span></div><div class="line" id="LC55"> <span class="k">border</span><span class="o">:</span> <span class="m">2px</span> <span class="k">solid</span> <span class="m">#4899BE</span><span class="p">;</span></div><div class="line" id="LC56"><span class="p">}</span></div><div class="line" id="LC57"><br /></div><div class="line" id="LC58"><span class="nt">textarea</span><span class="nd">:focus</span><span class="o">,</span> <span class="nt">input</span><span class="nd">:focus</span> <span class="p">{</span></div><div class="line" id="LC59"> <span class="k">border</span><span class="o">:</span> <span class="m">2px</span> <span class="k">solid</span> <span class="m">#9b251b</span><span class="p">;</span></div><div class="line" id="LC60"><span class="p">}</span></div><div class="line" id="LC61"><br /></div><div class="line" id="LC62"><span class="nc">.throbber</span> <span class="p">{</span></div><div class="line" id="LC63"> <span class="k">width</span><span class="o">:</span> <span class="m">100%</span><span class="p">;</span></div><div class="line" id="LC64"> <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span></div><div class="line" id="LC65"> <span class="k">margin-top</span><span class="o">:</span> <span class="m">50px</span><span class="p">;</span></div><div class="line" id="LC66"><span class="p">}</span></div><div class="line" id="LC67"><br /></div><div class="line" id="LC68"><span class="nc">.throbber</span> <span class="nt">img</span> <span class="p">{</span></div><div class="line" id="LC69"> <span class="k">text-align</span><span class="o">:</span> <span class="k">center</span><span class="p">;</span></div><div class="line" id="LC70"><span class="p">}</span></div><div class="line" id="LC71"> <span class="nt"></style></span></div><div class="line" id="LC72"><br /></div><div class="line" id="LC73"> <span class="nt"><script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">language=</span><span class="s">"javascript"</span> <span class="na">src=</span><span class="s">"http://code.jquery.com/jquery-1.4.2.min.js"</span><span class="nt">></script></span> </div><div class="line" id="LC74"> <span class="nt"><script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">language=</span><span class="s">"javascript"</span> <span class="na">src=</span><span class="s">"http://s.phono.com/releases/0.1/jquery.phono.js"</span><span class="nt">></script></span> </div><div class="line" id="LC75"> <span class="nt"><script </span><span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></span> </div><div class="line" id="LC76"><span class="nx">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nx">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class="line" id="LC77"><br /></div><div class="line" id="LC78"> <span class="kd">var</span> <span class="nx">myPhono</span> <span class="o">=</span> <span class="nx">$</span><span class="p">.</span><span class="nx">phono</span><span class="p">({</span></div><div class="line" id="LC79"> </div><div class="line" id="LC80"> <span class="nx">onReady</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class="line" id="LC81"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#sendChat"</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s2">"disabled"</span><span class="p">,</span> <span class="kc">false</span><span class="p">);</span></div><div class="line" id="LC82"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#loader"</span><span class="p">).</span><span class="nx">hide</span><span class="p">();</span></div><div class="line" id="LC83"> <span class="nx">$</span><span class="p">(</span><span class="s2">"#chat"</span><span class="p">).</span><span class="nx">fadeIn</span><span class="p">(</span><span class="mi">2000</span><span class="p">);</span></div><div class="line" id="LC84"> <span class="p">},</span></div><div class="line" id="LC85"> </div><div class="line" id="LC86"> <span class="nx">messaging</span><span class="o">:</span> <span class="p">{</span></div><div class="line" id="LC87"> <span class="nx">onMessage</span><span class="o">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span></div><div class="line" id="LC88"> <span class="c1">// Get message from event and log it</span></div><div class="line" id="LC89"> <span class="kd">var</span> <span class="nx">message</span> <span class="o">=</span> <span class="nx">event</span><span class="p">.</span><span class="nx">message</span><span class="p">;</span></div><div class="line" id="LC90"> <span class="nx">appendChat</span><span class="p">(</span><span class="s2">"\Chatbot:"</span> <span class="o">+</span> <span class="nx">message</span><span class="p">.</span><span class="nx">body</span><span class="p">);</span> </div><div class="line" id="LC91"> <span class="p">}</span></div><div class="line" id="LC92"> <span class="p">},</span></div><div class="line" id="LC93"><br /></div><div class="line" id="LC94"> <span class="p">});</span> <span class="c1">// end .phono</span></div><div class="line" id="LC95"><br /></div><div class="line" id="LC96"> <span class="nx">$</span><span class="p">(</span><span class="s1">'#sendChat'</span><span class="p">).</span><span class="nx">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span></div><div class="line" id="LC97"> <span class="kd">var</span> <span class="nx">msg</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">'#chatText'</span><span class="p">).</span><span class="nx">val</span><span class="p">();</span></div><div class="line" id="LC98"> <span class="k">if</span> <span class="p">(</span><span class="nx">msg</span><span class="p">.</span><span class="nx">length</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> </div><div class="line" id="LC99"> <span class="k">return</span><span class="p">;</span> </div><div class="line" id="LC100"> <span class="p">}</span></div><div class="line" id="LC101"> <span class="nx">appendChat</span><span class="p">(</span><span class="s2">"\nYou: "</span> <span class="o">+</span> <span class="nx">msg</span><span class="p">);</span></div><div class="line" id="LC102"> <span class="nx">myPhono</span><span class="p">.</span><span class="nx">messaging</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="s2">"MYBOT@bot.im"</span><span class="p">,</span> <span class="nx">msg</span><span class="p">);</span></div><div class="line" id="LC103"> <span class="p">});</span></div><div class="line" id="LC104"><br /></div><div class="line" id="LC105"> <span class="nx">$</span><span class="p">(</span><span class="s1">'form'</span><span class="p">).</span><span class="nx">submit</span><span class="p">(</span><span class="kd">function</span> <span class="p">()</span> <span class="p">{</span> </div><div class="line" id="LC106"> <span class="k">return</span> <span class="kc">false</span><span class="p">;</span> </div><div class="line" id="LC107"> <span class="p">});</span> </div><div class="line" id="LC108"><br /></div><div class="line" id="LC109"> <span class="kd">function</span> <span class="nx">appendChat</span><span class="p">(</span><span class="nx">msg</span><span class="p">)</span> <span class="p">{</span></div><div class="line" id="LC110"> <span class="c1">// Append msg and scroll chat history.</span></div><div class="line" id="LC111"> <span class="kd">var</span> <span class="nx">history</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s1">'#chatHistory'</span><span class="p">);</span></div><div class="line" id="LC112"> <span class="nx">history</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">msg</span><span class="p">);</span> </div><div class="line" id="LC113"> <span class="c1">// If the text does not fit in the text box, scroll up.</span></div><div class="line" id="LC114"> <span class="nx">history</span><span class="p">.</span><span class="nx">animate</span><span class="p">({</span> <span class="nx">scrollTop</span><span class="o">:</span> <span class="nx">history</span><span class="p">.</span><span class="nx">height</span><span class="p">()</span> <span class="p">},</span> <span class="mi">1000</span><span class="p">);</span></div><div class="line" id="LC115"> <span class="c1">// Clear input box.</span></div><div class="line" id="LC116"> <span class="nx">$</span><span class="p">(</span><span class="s1">'#chatText'</span><span class="p">).</span><span class="nx">val</span><span class="p">(</span><span class="s1">''</span><span class="p">);</span></div><div class="line" id="LC117"> <span class="p">};</span></div><div class="line" id="LC118"><br /></div><div class="line" id="LC119"><span class="p">});</span> <span class="c1">// end ready</span></div><div class="line" id="LC120"> <span class="nt"></script></span></div><div class="line" id="LC121"><br /></div><div class="line" id="LC122"> <span class="nt"></head></span> </div><div class="line" id="LC123"> <span class="nt"><body></span> </div><div class="line" id="LC124"><br /></div><div class="line" id="LC125"> <span class="nt"><div</span> <span class="na">class=</span><span class="s">"throbber"</span> <span class="na">id=</span><span class="s">"loader"</span><span class="nt">></span> </div><div class="line" id="LC126"> <span class="nt"><img</span> <span class="na">src=</span><span class="s">"images/spinner.gif"</span><span class="nt">/></span> </div><div class="line" id="LC127"> <span class="nt"></div></span> </div><div class="line" id="LC128"> </div><div class="line" id="LC129"> <span class="nt"><div</span> <span class="na">id=</span><span class="s">"chat"</span> <span class="na">style=</span><span class="s">"display:none"</span><span class="nt">></span> </div><div class="line" id="LC130"> <span class="nt"><form</span> <span class="na">id=</span><span class="s">"chatForm"</span><span class="nt">></span></div><div class="line" id="LC131"> <span class="nt"><fieldset></span> </div><div class="line" id="LC132"> <span class="nt"><legend></span>My chatbot is <span class="nt"><span</span> <span class="na">style=</span><span class="s">"color:rgb(0, 255, 0);"</span><span class="nt">></span>ONLINE<span class="nt"></span></legend></span> </div><div class="line" id="LC133"> <span class="nt"><p><textarea</span> <span class="na">cols=</span><span class="s">"70"</span> <span class="na">rows=</span><span class="s">"20"</span> <span class="na">name=</span><span class="s">"messages"</span> <span class="na">id=</span><span class="s">"chatHistory"</span> <span class="na">title=</span><span class="s">"Live chat"</span><span class="nt">></textarea><p/></span> </div><div class="line" id="LC134"> <span class="nt"><p><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">size=</span><span class="s">"50%"</span> <span class="na">name=</span><span class="s">"message"</span> <span class="na">id=</span><span class="s">"chatText"</span><span class="nt">/></span><span class="ni">&nbsp;</span></div><div class="line" id="LC135"> <span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">disabled=</span><span class="s">"true"</span> <span class="na">value=</span><span class="s">"Chat"</span> <span class="na">name=</span><span class="s">"send"</span> <span class="na">id=</span><span class="s">"sendChat"</span><span class="nt">/></p></span> </div><div class="line" id="LC136"> <span class="nt"></fieldset></span> </div><div class="line" id="LC137"> <span class="nt"></form></span> </div><div class="line" id="LC138"> <span class="nt"></div></span> </div><div class="line" id="LC139"> </div><div class="line" id="LC140"> <span class="nt"></body></span> </div><div class="line" id="LC141"><span class="nt"></html></span> </div></pre></div> </td> </tr> </table> </div></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/adding-a-minimal-online-interface-to-an-imifi">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-77871996743544733542010-07-27T07:10:00.001-07:002010-07-27T07:10:14.574-07:00python-csp Europython round-up<div class='posterous_autopost'><p><a href="http://www.europython.eu/" title="Europython website" target="_blank">Europython</a> was excellent this year and while the range of talks was very wide, the main themes seemed to be web scripting and web applications, virtual machines and concurrency. <a href="http://www.russel.org.uk/">Russel Winder</a> gave a keynote on the future of multicore computers and their implications, and a longer talk about Python and the CSP style of concurrency, <a href="http://yeoldeclue.com/cgi-bin/blog/blog.cgi">Michael Sparks</a> gave a lightening talk about his work on <a href="http://www.kamaelia.org/Home.html">Kamaelia</a>, <a href="http://andrewfr.wordpress.com/">Andrew Francis</a> talked about implementing ALTing in Stackless Python and <a href="http://tonyibbs.co.uk/">Tony Ibbs</a> talked about KBus, which is like DBus but sensible, and I gave an introductory talk on our <a href="http://code.google.com/p/python-csp/">python-csp</a> project.</p> <p><object height="417" width="500"> <param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pythoncsp-100727083606-phpapp02&stripped_title=pythoncsp-bringing-occam-to-python" /> <param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /> <embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=pythoncsp-100727083606-phpapp02&stripped_title=pythoncsp-bringing-occam-to-python" allowfullscreen="true" type="application/x-shockwave-flash" allowscriptaccess="always" height="417" width="500"></embed> </object></p> <p> </p> <p><strong><span style="font-size: medium;">python-csp sprint report</span></strong></p> <p>Post-talks we had two days of Sprints and, having never been to a Sprint before I'm really amazed at how much we managed to get done in the <a href="http://code.google.com/p/python-csp/">python-csp</a> sprint over such a short amount of time. I concentrated on the online tutorial which was well overdue for an overhaul, and the below is just a brief account of all our other activities -- apologies if I've missed anyone out or mis-attributed anything:</p> <ul> <li>Fabian Kreutz fixed and merged Russel's Python3 port into the default repository, closed a bunch of ancient branches, tidied up our strategy for importing the code library, fixed a whole load of bugs and hosted a Mercurial clone of the main repository on BitBucket for us.</li> <li>Russel started a MacOS port, found a whole world of issues with that, and fixed a few bugs. </li> <li>Richard Taylor joined us on the Friday and helped configure Linux to solve the "too many open files on disk" OS error that is thrown when too many channels or processes are created. Tony Heskett told us how to fix the same problem on Mac OS. Richard also gave us some really great ideas about how to use the POSIX standard to finish off Sam Wilson's work on a C implementation of channels.</li> <li>Joe Metcalfe, Wout Tankink, Urban Skudnik and others went through the tutorials in some detail, fixing bugs and posting a bunch of bug reports. Fabian tried to eliminate some of the dependencies from the examples and make them a bit easier to understand. Urban also wrote a channel poisoning example and the tutorial page that goes with it.</li> <li>Michael Sparks had to go home, but joined us over IRC and gave us a better understanding of the differences between Kamaelia and other asynchronous forms of message passing and the CSP style of programming. Later Michael produced a really interesting <a href="http://pastebin.com/B1kqx88G" target="_blank">OCCAM model</a> of one form of Kamaelia synchronisation primitive, which has been a good prompt to sort out guarded ALTing for python-csp.</li> <li>Stefan Swarzer went through our testing strategy and started formalising a really neat way to unit test python-csp code and wrote up some unit tests for the large number of built-in processes we have in the library. Stefan also got us thinking about licensing issues for python-csp, which probably deserves a wider discussion elsewhere. </li> <li>Andrew Francis dropped in briefly on his way to the PyPy sprint, and sent over a deadlock detection algorithm and some other ideas.</li> </ul> <p>Thanks to everyone who came along to the Sprint, it was great fun and hopefully we can keep up some momentum. During the Sprint we added six new project members with commit privileges and set up a <a href="http://groups.google.com/group/python-csp">public mailing list</a>. If you were at the Sprint or already had commit access to the repository you should already have received an invite to the list, but if not it is public so feel free to join.</p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://python-csp.posterous.com/python-csp-europython-round-up">python-csp</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-43110302732659392942010-06-24T18:10:00.001-07:002010-06-24T18:10:18.580-07:00How to choose a good BSc or MSc project<div class='posterous_autopost'><p style="text-align: left;"><img src="http://posterous.com/getfile/files.posterous.com/projectsuccess/dizvCCbxadllgxrIbyfDHxrrCexGvIhjAIxJlflIBCqGbBlqrBaHGwDjBEfk/media_httpfarm3static_zGGtJ.jpg.scaled500.jpg" width="240" height="180"/> </p> <p style="text-align: left;"><em>Planning stuff...</em></p> <p>A critical part of the success or failure of any thesis project is the initial choice of what to work on. This is a surprisingly difficult part of any project, in some ways the most difficult part, and it's something that we see students struggle with year on year. Nothing is so disappointing than marking a project and coming to the realisation that with some better decisions at the beginning of the year a failing project could have passed. This is a trap to avoid, and by avoiding it you will not only improve your chances of passing your project, you will greatly improve your chances of getting a first. In fact, projects are pretty straight forward to do well in, so long as you fully understand what is expected of you. This post takes you through what you need to focus on and avoid right at the start of your project journey.</p> <p> </p> <p><span style="font-size: medium;"><strong>Do something you are interested in</strong></span></p> <p>A final year or MSc project is a six month, single person project and in most Universities students will have to study several other modules concurrently. This is a long time to be working on a single piece of coursework, so it is important to choose a project which will hold your attention for that length of time. Moreover, you will be working on other things at the same time, so ideally you need to choose a project that is compelling enough that you <em>want</em> to work on it, in preference to doing other things. </p> <p> </p> <p><span style="font-size: medium;"><strong>How to know what you are interested in</strong></span></p> <p>This might seem like a rather unnecessary topic -- what is "interesting" is very personal and individual. However, estimating what you might find interesting in several months time, when you are under pressure to meet deadlines is not easy. One trick to weight the odds in your favour is to choose a project which you do not, at the start of the project, entirely know how to complete. Like Einstein said: "If we knew what we were doing, it wouldn't be called research". Obviously, don't choose something that is completely outside your area of expertise. If you have spent two years studying bioinformatics then don't suddenly decide to try a dissertation in ceramics, but equally, if you know exactly how to complete every part of the work that you will need to do for your project then your idea is not "big" enough in scope. This point, really is the key to finding a project and much of the rest of this post expands upon it: a thesis or dissertation is not simply a long piece of coursework, it is an individual, self-contained work which should stand on its own. Think of it as a sort of "first job". When you leave University and apply for further study or a job, then the results of your project will be part of the professional portfolio of work you can use to convince a future employer to take you on.</p> <p> </p> <p><span style="font-size: medium;"><strong>Project difficulty: a difficult project is an easy project</strong></span></p> <p>By far and away the biggest mistake that we regularly see from students writing project proposals is choosing a project which is far, far too easy. The train of thought seems to go ... projects are difficult, I want to make the project easier, therefore, I will choose a simple idea to work on. The classic examples of this in Computer Science are "a website with a database" -- usually for a family member or friend who runs a small business -- or occasionally a website or database on their own. What's wrong with this? Well... so many things:</p> <ol> <li>By the time a student has reached the final year of their degree, they will likely already have written several databases, websites and at least a couple of websites-with-a-database. Therefore, the project is something that the student has already been awarded credit for. This means that the student will not be demonstrating that they can learn independently, and go beyond what has been taught in lectures, which is one of the main purposes of the project.</li> <li>Because the proposal is about the same size and quality as an individual module coursework, it is not large enough in scope to gain many marks.</li> <li>An individual website, in ASP, PHP, or similar, for an SME is a very old problem for which there exist a large number of "turn-key" solutions -- that is, off the shelf products that can be used to create the product. These include templating systems such as Joomla, cloud-based solutions such as Google Sites, Posterous, Tumblr and so on, wikis, and a number of other technologies. A straightforward website-with-a-database is, therefore, in no way a demonstration of the students ability to work at the cutting edge of their field.</li> <li>A website-with-a-database is not a problem, it's a solution to a problem. A project proposal should propose an interesting problem, with a suggested strategy for solving that problem during the progress of the project. </li> </ol> <p>Having said this, I have seen and indeed supervised a number of excellent projects, for which the student implemented some sort of website and some sort of database. So, it's not that websites or databases are inherently bad choices as solutions to the problems posed by a project proposal, but a proposal MUST overcome the four problems outlined above.</p> <p>The heading for this section said (rather confusingly) that "a difficult project is an easy project". What I mean by this is that the "difficulty" of a project is something that will uppermost in the mind of the staff marking your thesis. A "difficult" project is likely to be looked upon favourably because it will be a bigger step away from what you have already been taught, you will need to be reading more academic literature, you will be showing more independent learning, and so on. These are some of the most important factors in getting a good grade, and far outweigh factors such as finishing every part of your practical work. The up-shot of this is that if you choose a "difficult" project and complete it quite poorly, you are likely to get better marks than a student who chooses an "easy" project and completes all of their practical work. If you did choose to work on a website-with-a-database-for-an-sme then the proposal will be so easy that you will really have to complete every part of the project perfectly just to get a pass. So, choose a small but difficult project.</p> <p> </p> <p><span style="font-size: medium;"><strong>Have a research question</strong></span></p> <p>In the last section I said that a project proposal should pose a problem, not a solution to a problem. Ideally, it is best to phrase this as a research question, such as the following:</p> <ul> <li>is algorithm X more efficient than algorithm Y?</li> <li>is it possible to implement product Z on the cloud?</li> <li>can feature L be added to programming language P?</li> <li>can theorem T be proven?</li> <li>can algorithm Z be adapted to be used in conditions C?</li> </ul> <p>and so on. There are several advantages to this. One is that this is a standard form of writing in academia, and your project will be marked against academic criteria. Secondly, if the aim of your project is to answer a question then you leave the issue of <em>how</em> to answer that question reasonably open ended. It may be that you have a very clear idea, at the start of the project, what you are going to do. That's fine, but as you progress through the project you may well find literature that enlightens your views on how your question can be answered. Thirdly, your answer to the question may not be what you expect. That's fine, it's OK to find out that actually, your algorithm isn't as efficient as you thought, or the theorem cannot be proved, so long as you give solid, convincing evidence for your answer. </p> <p> </p> <p><span style="font-size: medium;"><strong>Do something practical</strong></span></p> <p>If you are working in the sciences, it really is important that you do <em>something</em> practical as part of your work. For these purposes "practical" can mean experimental work or mathematical work -- it's OK to prove a theorem, for example, as the main part of the "practical" content of your work. What you should avoid though, is vague, nebulous, thought-pieces, which have no clear results and cannot be evaluated. Avoid anything with a title like "an investigation into X" or "a dissertation on Y". These sorts of writing are well accepted in the humanities, but for a scientific piece of work you need to propose a question and find some answer to it. Equally, a literature review is not really a project in itself, it needs some research question and evaluation with it to form a complete project.</p> <p> </p> <p><span style="font-size: medium;"><strong>Focus on evaluation from the start</strong></span></p> <p>Evaluating your work will likely be the last practical work you complete before finishing your dissertation writing. However, you should know from the start of your project how you plan to do this. As with unit-testing, it is best to have designed you evaluation in as much detail as possible before you start you practical work. That way, you know that what you are aiming for is something that can be evaluated in the manner in which you have planned. Remember, the purpose here is to determine whether your project has answered your original research question.</p> <p>In general, your evaluation will fall into one of the following categories:</p> <ul> <li> <strong>Performance evaluation:</strong> either testing the speed, memory footprint, scalability, load-balancing, or other aspect of the performance of a program or system. This is often the easiest form of evaluation -- it can be performed by a program and so automated, the results can be analysed and presented using a statistics and you will not be reliant on users. Work in programming languages, networking, operating systems, databases, and hardware tend to suit this sort of evaluation well.</li> <li> <strong>User-acceptance testing and usability:</strong> if your project involves creating a product for end-users to test, especially if you have an industrial client, then it is essential that you perform some sort of user acceptance testing. Good options for this are the talk-aloud protocol or semi-structured interviews. NEVER, EVER, EVER think that a "heuristic" evaluation is sufficient. Heuristic methods only catch basic errors, they tell you nothing about how your users will actually experience your product.</li> <li> <strong>Formal or semi-formal methods:</strong> such as proving a theorem, using a model checker (such as SPIN), using a formal method such as B or Z to show that your work is free of particular types of errors.</li> </ul> <p> </p> <p><span style="font-size: medium;"><strong>Take (academic) advantage of your supervisor</strong></span></p> <p>Every student will have at least one supervisor, who will usually be actively involved in research, consultancy or something similar. This sort of work can provide a wealth of good ideas for projects and has several advantages. Firstly, your supervisor will propose projects that have the right scope and difficulty for your degree course. Secondly, if your supervisor has an interest in what you are doing, they will have a vested interest in seeing you succeed and of course will have a lot of relevant expertise with which they can advise you. Lastly, it is likely that your work will be used by other members of a research group which will give you access to feedback on what you have done.</p> <div> </div> <p><span style="font-size: medium;"><strong>Be flexible (within reason)</strong></span></p> <p>Remember that a project is a marathon, not a sprint. It may well be that you get part way along the journey and find out that what you had first set out to do is actually impossible, or impossible within the scope of the project. Or it may be that you find some other way of answering your research question, or you uncover some literature which shows that the question can actually be answered very simply. In this case, you should speak with your supervisor and find a way to reword or even completely change your original research question. This is quite a reasonable thing to do and happens often in "real" research projects, so you should not be worried about it. Your final project does not have to match the original proposal exactly, but you should be able to explain why the changes you made were necessary.</p> <p> </p> <p><span style="font-size: medium;"><strong>Summary</strong></span></p> <ul> <li>DO choose a project that will hold your interest for the duration of the project.</li> <li>DO NOT choose a project that is the same size or scope as a coursework, or something that is very similar to work you have been set in a module.</li> <li>DO propose a "difficult" problem -- it is easier to pass a challenging project than an "easy" one!</li> <li>DO propose a research question, and an idea for solving it.</li> <li>DO propose a project with some sort of practical or mathematical component, DO NOT set out to write a commentary on a topic.</li> <li>DO have a very clear plan for how you will evaluate your project. This should clearly state how you will determine whether or not you have answered your research question.</li> <li>DO NOT evaluate an end-user product with only heuristic methods.</li> <li>DO test end-user products with real users.</li> <li>DO take advantage of the expertise of your project supervisor and their research interests.</li> <li>DO be flexible, if you find that your original research question cannot be answered, or if you find that a more "interesting" research question emerges during your project.</li> </ul> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://projectsuccess.posterous.com/how-to-choose-a-good-bsc-or-msc-project">Pass your final year project</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-52193751337644888312010-05-05T12:49:00.001-07:002010-05-05T12:49:06.605-07:00Introducing server processes<div class='posterous_autopost'><p>Much of the recent activity on the python-csp code base has to do with finding useful ways to debug networks of CSP processes. The dynamic analysis of CSP programs has a long history, dating back to Hoare's original work. I'll post more about that another time, but this post details a small change to the core library that enables debugging to run effectively. </p> <p>A common idiom in CSP-style code is to have many processes in a process network (connected via channels, or other guards) which all loop forever. If the program needs to be terminated, that is usually done via channel poisoning. I call these processes <em>server processes</em>, because they continually serve values to their output channels (if they have any).</p> <p>In fact, all of the processes in the <strong>csp.builtins</strong> library are server processes, and python-csp has quite a few of these. It has most of the processes from the JCSP "plugNplay" package and a distinct process for every built-in unary or binary operator in Python. So, for example, the <strong>csp.builtins.Plus</strong> processes reads two pieces of data from its input channels, and sends their addition to an output channel. One possible implementation of <strong>csp.builtins.Plus</strong> would be this:</p> <p><code> @process def Plus(inchan1, inchan2, outchan): while True: outchan.write(inchan1.read() + inchan2.read() </code></p> <p>In reality, this isn't quite how <strong>csp.builtins.Plus</strong> is implemented, as there are quite a few unary and binary operators in Python, so we make use of metaprogramming to generate most of these builtin processes.</p> <p>The problem with server processes is that if you want your debugger to deduce useful information about your program then at some point your code needs to terminate so that the debugger can compute a call graph, or some other structure, from which other useful information can be gathered. Ideally, it would also be nice if the debugger could deduce that your server processes are intending to run indefinitely, even though it actually terminates when the debugger executes them.</p> <p>To achieve this effect, python-csp now has a special class for creating server processes called <strong>CSPServer</strong>, and a new decorator, called <strong>@forever</strong>. These work exactly like the usual <strong>CSPProcess</strong> and <strong>@process</strong> types that have been included in python-csp since its inception. Apart from using the new constructors, the only change you need to make in your code to use <strong>@forever</strong> or <strong>CSPServer</strong> is that a server process should be a generator and, usually, it should yield at the end of each iteration of its internal loop.</p> <p>As an example, if we were to reimplement <strong>csp.builtins.Plus</strong> with the new constructors, we can do this in two ways, firstly with the decorator (which is the recommended method) and secondly using the <strong>CSPServer</strong> class directly. In the code below I am using two other processes from <strong>csp.builtins</strong>: <strong>Generate</strong> which sends an infinite supply of integers down its output channel and <strong>Printer</strong> which prints anything it reads from its input channel to STDOUT (by default, you can customise this to use any other file type). So now, <strong>Plus</strong> could be implemented thus:</p> <p><code> @forever def Plus(inchan1, inchan2, outchan): while True: outchan.write(inchan1.read() + inchan2.read()) yield ... # Silly way to print even numbers in1, in2, out = Channel(), Channel(), Channel() Generate(in1) & Generate(in2) & Plus(in1, in2, out) & Printer(out) </code></p> <p>If we decide not to use decorators, then the code is essentially the same, we just need to remember to construct any <strong>Plus</strong> processes with the <strong>CSPServer</strong> class:</p> <p> </p><p><code> @forever def Plus(inchan1, inchan2, outchan): while True: outchan.write(inchan1.read() + inchan2.read()) yield ... # Silly way to print even numbers in1, in2, out = Channel(), Channel(), Channel() Generate(in1) & Generate(in2) & CSPServer(Plus, in1, in2, out) & Printer(out) </code></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://python-csp.posterous.com/introducing-server-processes">python-csp</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-25557468996119417422010-04-03T14:27:00.001-07:002010-04-03T14:27:49.564-07:00Setting up the Freeduino v1.16 and Nokia 3310 LCD shield on Ubuntu Karmic<div class='posterous_autopost'><p>This post contains some brief notes on setting up a Freeduino (or Arduino) and Nokia 3310 LCD shield on Ubuntu Karmic, this should probably work OK for other versions of Ubuntu and other versions of the Freeduino or Arduino.</p> <p><strong>Installing the Arduino SDK</strong></p> <p>Firstly, install the Arduino SDK. This requires adding a new repository to your list of software sources, installing the Arduino SDK and removing a conflicting package:</p> <p><code> $ sudo add-apt-repository ppa:arduino-ubuntu-team/ppa $ sudo apt-get update $ sudo apt-get install arduino $ sudo apt-get remove brtlly </code></p> <p>Now you should be able to find an entry for "Arduino" on your <strong>Application -> Programming</strong> menu (if you are using Gnome, it might be somewhere slightly different with KDE). That is a link to the Arduino SDK which is a modified version of the <a href="http://processing.org/" title="Proce55ing programming language">Proce55ing</a> IDE if you have used that. It should look like the picture below when you start it. <a href="http://www.flickr.com/photos/sarahmount/4487075061/"><img class="posterous_download_image" src="http://farm5.static.flickr.com/4041/4487075061_c3032cfec2.jpg" border="0" height="500" width="455" /></a> </p> <p><strong>Installing the Nokia 3310 libraries</strong></p> <p>Next, you need libraries for the Nokia 3310 shield. You can download these directly from <a href="http://www.nuelectronics.com/estore/index.php?main_page=product_info&products_id=12&zenid=34fc4187222ea4c5ee15eff345b8a67d" title="Nokia LCD arduino shield + software">NuElectronics</a> or get a slightly updated version from Andrew Lindsey: <a href="http://blog.thiseldo.co.uk/?p=383">http://blog.thiseldo.co.uk/?p=383</a> Either way, download the .ZIP file and unpack it somewhere in your home directory. The next bit isn't well documented, but what you need to do is to copy the files from the library to the directories that are expected by the Arduino SDK. Firstly, copy everything over to the Arduino library path:</p> <p><code> $ sudo cp -a nokia_3310_lcd /usr/share/arduino/libraries/ </code></p> <p>Now, if you restart the Arduino SDK and look up <strong>Sketch -> Import Library</strong> on the menu, you should see <strong>nokia_3310_lcd</strong> as an item on the list there.</p> <p>Next, you need to put the example Arduino application where the IDE can find it:</p> <p><code> $ sudo cd /usr/share/arduino/libraries/nokia_3310_lcd $ sudo mkdir /usr/share/doc/arduino/examples/Nokia $ sudo mv examples /usr/share/doc/arduino/examples/Nokia </code></p> <p><strong>Try everything out</strong></p> <p>Now, if you place the Nokia shield on top of your Arduino or Freeduino (it only fits one way), and attached the Arduino to your USB port you should be able to try out the example application. Restart the Arduino SDK, make sure you go to <strong>Tools -> Board</strong> and select the board you are using -- look on the long chip on the board to find out whether you have an ATmega328 or ATmega168 if you are not sure. Also, go to <strong>Tools -> Serial Port</strong> to select the port that has been assigned to the Arduino. If <strong>Serial Port</strong> is greyed out on the menu then unplug the Arduino from the USB port and put it back in again (to force the OS to reassign a new virtual USB device to the Arduino). </p> <p>Now, go to <strong>File -> Examples -> Nokia</strong> and open up the example "sketch" or program. Press the <strong>Verify</strong> button (that looks like a triangle) to compile the sketch. If you have placed the libraries in the right place you should get a message like this at the bottom of the GUI:</p> <p><code> Binary sketch size: 3858 bytes (of a 30720 byte maximum) </code></p> <p>Lastly, press the <strong>Upload</strong> button (the one with an arrow pointing right) to upload the compiled code to the board, and you should see something like the results in the photo below.</p> <p><a href="http://www.flickr.com/photos/sarahmount/4487874512/"><img class="posterous_download_image" src="http://farm5.static.flickr.com/4015/4487874512_ce6b227aaf.jpg" border="0" height="375" width="500" /></a></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://snim2.posterous.com/setting-up-the-freeduino-v116-and-nokia-3310">snim2's posterous</a> </p> </div>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-42983397373250432192010-01-19T05:33:00.001-08:002010-01-19T05:33:10.553-08:00Fixing Eclipse on Ubuntu Karmic
<div class='posterous_autopost'><p>Since upgrading to Karmic all my copies of Eclipse have been unusable. Text doesn't seem to appear, clicking on the GUI makes it crash, eugh. Sadly, I can't use emacs for <em>quite</em> everything, so here's a quick fix for Eclipse, just place this somewhere sensible in your <strong>~/.bashrc</strong> file and you should be fine (unless you've found a different Eclispe bug, in which case you're on your own!):</p> <p><div class="data syntax type-bash"> <table cellspacing="0" cellpadding="0"> <tr> <td> <pre class="line_numbers"> <span rel="#L1" id="LID1">1</span> <span rel="#L2" id="LID2">2</span> <span rel="#L3" id="LID3">3</span> </pre> </td> <td width="100%"> <div class="highlight"><pre /><div class="line" id="LC1"><span class="c"># Fix Eclipse on Ubuntu Karmic</span></div><div class="line" id="LC2"><span class="nb">export </span><span class="nv">GDK_NATIVE_WINDOWS</span><span class="o">=</span>1</div><div class="line" id="LC3"> </div></pre></div> </td> </tr> </table> </div></p> <p> </p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://snim2.posterous.com/fixing-eclipse-on-ubuntu-karmic">snim2's posterous</a> </p> </div> Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-65181804304869584652009-12-12T13:59:00.001-08:002009-12-12T13:59:23.221-08:00Fixing tabs and spaces in emacs
<p><span style="font-family: Sans; font-size: medium;"> <div style="color: #000000; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; margin: 8px;"> <h2 style="font-size: 1.5em;">Tabs to spaces</h2> <p>Ever since I upgraded to Ubuntu Karmic I've had problems with tabs and spaces in <a href="http://www.gnu.org/software/emacs/manual/" title="Eight Megs and Constantly Swapping">emacs23</a>. I have indent-tabs set to nil, but somehow a set of four spaces will still be saved as a tab. This is a pain when writing in languages like <a href="http://www.python.org">Python</a>, where whitespace is semantically meaningful and mixing tabs and spaces can cause a syntax error.</p> <p>To deal with this I wrote a small <a href="http://www.gnu.org/software/emacs/manual/elisp.html" title="Emas LISP manual">emacs-lisp</a> function to convert all tabs in the active region (i.e. the currently selected text) to four spaces:</p> <p><script src="http://gist.github.com/223491.js"></script></p> <h2 style="font-size: 1.5em;">Spaces to tabs</h2> <p>Similarly, I have a set of generic <a href="http://www.gnu.org/software/make/manual/" title="Make manual">Makefiles</a> for LaTeX papers, OCaml programs and other things. These are all saved on github or on wikis and I copy them when starting a new project. Makefiles are very sensitive to changes in whitespace and characters which should be tabs may not be spaces. If you copy and paste this sort of code from a webpage you will always get spaces rather than tabs and so need to replace these. The following two functions convert each group of four spaces (or eight spaces) in the active region to a tab:</p> <p><script src="http://gist.github.com/255084.js"></script></p> <h2 style="font-size: 1.5em;">Using these functions</h2> <p>If you have been using <a href="http://www.gnu.org/software/emacs/manual/" title="Escape Meta Alt Control Shift">emacs</a> for a while you will probably already know how to customise it. If not, start by finding (or creating) your initialisation file. This will either be in <strong>~/init.el</strong> or <strong>~/.emacs.d/init.el</strong> Add the functions you want to use to that file, then make sure that Emacs re-evaluates the file by typing <strong>M-x eval-buffer</strong>. Then move to the buffer where you want to convert your tabs or spaces and use any of the above functions by typing <strong>M-x <function-name></strong> just as if you were using a built-in function. That's all there is to extending <a href="http://www.gnu.org/software/emacs/manual/" title="Easily Maintained with the Assistance of Chemical Solutions">emacs</a> :-)</p> </div> </span></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://snim2.posterous.com/fixing-tabs-and-spaces-in-emacs">snim2's posterous</a> </p> Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com1tag:blogger.com,1999:blog-6743221205429103305.post-57547202565807090362009-11-28T19:28:00.001-08:002009-11-28T19:28:44.200-08:00Python, communicating processes and Pygame
<p><span style="font-family: Sans; font-size: medium;"> <div style="color: #000000; font-family: Arial, Helvetica, sans-serif; font-size: 13px; background-color: #ffffff; margin: 8px;"> <div> <p><a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a> is a popular and excellent library for writing 2d arcade games and animations. It takes an approach that has become very popular in the <a href="http://www.python.org" title="Python website" target="_blank">Python</a> world, it wraps the low-level <a href="http://www.libsdl.org/" title="libsdl homepage" target="_blank">SDL</a> library giving programmers the best of both worlds -- efficiency from the underlying C++ code and a simple, productive scripting environment from the high-level <a href="http://www.python.org" title="Python website" target="_blank">Python</a> wrappers. <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a> is so simple, it is used in a number of introductory text books, including our own book, <a href="http://www.pythonforrookies.org" title="Python for Rookies" target="_blank">Python for Rookies</a>. One reason for the simplicity of <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a> is it's approach to events: events exist, but <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a> is not event driven. The programmer has to write his / her own event loop and process events which are relevant to the application explicitly. This makes for a model of interaction that is very easy for beginners to understand and very easy for experts to get right.</p> <p>For nearly a year now I have been working on <a href="http://code.google.com/p/python-csp/" title="python-csp library" target="_blank">python-csp</a> which adds Hoare's Communicating Sequential Processes (CSP) to<a href="http://www.python.org" title="Python website" target="_blank">Python</a> and is nearing a full release. You can read more about CSP on the <a href="http://www.wotug.org/csp.shtml" title="CSP introduction from WoTUG" target="_blank">WoTUG site</a>, but briefly it is a neat way of implementing "message-passing" concurrency to construct concurrent and parallel programs. CSP eliminates several classes of well-known bugs in this sort of software, including race conditions, and makes it much easier to avoid deadlocks. In a CSP program, there are no "locks" which cuts out a lot of difficult boilerplate code. Instead, a CSP program typically consists of a number of CSP processes (which may be reified as threads, processes, coroutines, or anything else) running in parallel. These communicate by sending data along synchronous "channels", which you can think of as being similar to UNIX pipes. Wherever you might use shared data or fire an event in another style of concurrency, in CSP you would send and receive data down a channel. Because the communication between processes is synchronous, the flow of data between processes can only happen in the order in which it appears statically in your code (a big advantage compared to event-driven systems). </p> <p>The details of <a href="http://code.google.com/p/python-csp/" title="python-csp library" target="_blank">python-csp</a> will keep for another post, but I wanted to document here a pattern for fixing a very irritating problem that occurs when writing <a href="http://code.google.com/p/python-csp/" title="python-csp library" target="_blank">python-csp</a> code which uses <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a>: it's very difficult to kill the application in the way you normally would, by pressing the "Close" button on the application window, pressing Alt+F4, or whatever. In CSP programs, the usual way of terminating running processes is to "poison" the channels which they use, which causes all processes which read / write to those channels to propagate the poisoning on any channels they know about and terminate themselves. Neil Brown has a very nice post on poisoning <a href="http://chplib.wordpress.com/2009/09/30/poison-concurrent-termination/" title="Neil Brown's post on channel poisoning in CHP" target="_blank">here</a> if you want more details and nice graphics. In <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a>, to quit the application there's a handy pygame.quit() function. Mixing these two requires a bit of alchemy, so it's worth knowing a pattern that works.</p> <p>For simple programs, the following is enough: just place all <a href="http://www.pygame.org" title="Pygame website" target="_blank">Pygame</a> related code in a single process which draws to the application window and have one or more channels to pass information from the rest of the running program to the drawing process. When a pygame.QUIT event is received drop out of the main animation loop and then (only then) poison any channels and quit the graphical application. Just like this:</p> <code> </code><pre style="color: #000000; font-family: Arial, Helvetica, sans-serif; font-size: 13px; margin: 8px;"><span style="color: #ff0000;">@process</span> <span style="color: #ff0000;">def</span> Drawme(channel, _process=<span style="color: #ff0000;">None</span>): <span style="color: #ff0000;">import</span> pygame <span style="color: #000080;"># Constants</span> width, height = 512, 256 <span style="color: #000080;"># Open window</span> pygame.init() screen = pygame.display.set_mode((width, height), 0) quit = <span style="color: #ff0000;">False</span> <span style="color: #ff0000;">while not</span> quit: data = channel.read() <span style="color: #000080;"># Drawing code goes here...</span> <span style="color: #ff0000;">for</span> event in pygame.event.get(): <span style="color: #ff0000;">if</span> event.type == pygame.QUIT: quit = <span style="color: #ff0000;">True</span> <span style="color: #000080;"># Process other events here ...</span> channel.poison() pygame.quit() <span style="color: #ff0000;">return</span></pre> <p> </p> <p>If you try this out, make sure to have a separate terminal open to watch the number of Python processes running in your OS and check that quitting really does work. On UNIX systems you can use the 'watch' utility for this: <strong>watch -n 0.5 'ps h -C python -o pid'</strong></p> <p>Here's an example Pygame / python-csp application, a simple demonstration of Reynold's <a href="http://en.wikipedia.org/wiki/Flocking_(behavior)" title="Reynold's "flocking" algorithm on Wikipedia" target="_blank">"flocking"</a> algorithm, which simulates a flock of birds or other wildlife moving in unison:</p> <p><object height="417" width="500"><param name="movie" value="http://www.youtube.com/v/1M-IP_q_66A&hl=en&fs=1" /></param><param name="wmode" value="window" /><param name="allowFullScreen" value="true" /></param><param name="allowscriptaccess" value="always" /></param><embed src="http://www.youtube.com/v/1M-IP_q_66A&hl=en&fs=1" allowfullscreen="true" type="application/x-shockwave-flash" allowscriptaccess="always" wmode="window" height="417" width="500"></embed></object></p> </div> </div> </span></p> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://snim2.posterous.com/python-communicating-processes-and-pygame">snim2's posterous</a> </p> Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-72368586529232725152009-10-25T15:38:00.001-07:002009-10-25T15:38:38.880-07:00Silently killing multiple Linux processes
<p>In the last few months I've been working with a lot of concurrent and parallel programs. One of the problems with this sort of programming is when you get it wrong, you can end up with a whole bunch of child processes running detached from their parent, like this:</p> <pre>24827 pts/3 00:00:00 python 24828 pts/3 00:00:00 python 24829 pts/3 00:00:00 python 24830 pts/3 00:00:00 python 24831 pts/3 00:00:00 python 24832 pts/3 00:00:00 python 24833 pts/3 00:00:00 python 24834 pts/3 00:00:00 python 24835 pts/3 00:00:00 python 24836 pts/3 00:00:00 python </pre> <div>Right now I have 103 of these orphaned Python processes. Using <code>killall</code> doesn't seem to work, so what we need to do is pass their PIDs directly to <code>'kill -9' </code>. <code>ps</code> will print a whole bunch of nice information, so we need to coerce <code>ps</code> into just printing out the information we want, like this:</div> <p /> <pre>$ ps h -C python -o pid ... 24814 24819 24820 24821 24822 ... </pre> <p /> <div>Then we can pass that to <code>kill -9</code>, like this:</div> <p /> <pre>$ kill -9 `ps h -C python -o pid` </pre> <p /> <div>Now we can find out how many Python processes are still running:</div> <p /> <pre>$ ps h -C python -o pid | wc -l 0 </pre> <p /> <div>zero -- just what we want :-)</div> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via web</a> from <a href="http://snim2.posterous.com/silently-killing-multiple-linux-processes">snim2's posterous</a> </p> Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-23290521295828892352009-10-17T17:27:00.001-07:002009-10-17T17:27:53.360-07:00How to write a literature review for your final year thesis project
<blockquote class="posterous_short_quote"> <a href='http://posterous.com/getfile/files.posterous.com/snim2/pDhHcyEBmqeAmjfzIyqwCudHladvilIwEuiDDDoAjrAqDojHhnokxiuHItGm/media_httpfarm1staticflickrcom92239809325553e2943c2bdjpg_EuhgCqzexxFDJvy.jpg.scaled1000.jpg'><img src="http://posterous.com/getfile/files.posterous.com/snim2/pDhHcyEBmqeAmjfzIyqwCudHladvilIwEuiDDDoAjrAqDojHhnokxiuHItGm/media_httpfarm1staticflickrcom92239809325553e2943c2bdjpg_EuhgCqzexxFDJvy.jpg.scaled500.jpg" width="500" height="375"/></a> </blockquote><br />A long time ago I wrote an article on <a href="http://snim2.blogspot.com/2005/11/how-to-pass-your-final-year-thesis.html">how to pass your final year thesis project</a>, which several students found helpful. In the same vein, this post deals with a particular aspect of the final year project: the literature review.<p /> Every year I supervise projects I find students tend to ask the same questions about their literature review. Most common are:<p /><ul><li>How many papers should I read?</li><li>How long should the literature review be?</li> <li>Should I read books, articles, or ...?</li><li>Is it OK to reference websites such as Wikipedia?</li><li>Who will read my literature review and what can I assume about their knowledge of the area?</li><li>When should I start the literature review and when should it be finished?</li> </ul><br />These questions crop up frequently and will be familiar to any readers who are starting their own project. However, when you fully understand the purpose of the literature and how to go about writing one, you begin to realise that these questions are actually not that important. This post is designed to help students make that transition, from not yet understanding what the literature review is for, to having a thorough understanding of its purpose and a clear idea of how to write it up.<p /> <b><span style="font-size: large;">The meaning of a final year project</span></b><p />A lot of students starting off their projects talk about writing a "report" at the end of their "project" and doing some "research" as part of their literature review. This is where the subtleties of the English language tend to cause a lot of confusion. "Research" can have many different meanings, and to complete a really successful final year project the first thing to do it to understand fully what is expected of you in an academic context. Even if your final year at University is the last experience you have of academic work, remember that your work will be marked according to academic criteria, and academia has quite different aims to industry.<p /> So, to be clear: <b>research</b>, in an academic context, means adding something new to the body of knowledge that humans have gathered in your area of interest. Your project as a whole will be a piece of research because you will be creating something new that has not been created before. What that is exactly will depend on the field you are studying. It might be a new perspective on a piece of literature, a new proof of a theorem, a new application of a particular technology, or something else. Since you are still an undergraduate it is likely (although not necessary) that your work will be a small step forward. It is unlikely that you will produce something completely ground breaking, so don't be intimidated by fact that your work has to be novel. That said, it may be that you produce an excellent piece of work and your supervisor may want to turn that into a technical report or conference paper with you, which would be great for your CV (or resume).<p /> A <b>thesis</b> is a statement of belief that is central to your research. Your <b>dissertation</b> will be a piece of writing that defends your thesis, based on your research. So, for example, if your thesis is regular, <i>online tests help University students to learn new material</i> then you will need to implement some sort of online tests for new material, design and run an experiment to test your thesis, and write it up in your dissertation. Equally, if your thesis is <i>water causes cancer in mice</i> then you will need to plan and run an experiment to determine whether or not this is true and write it up. Notice that you may disprove your thesis in your work. It may be that online tests do not help students learn, or that water doesn't cause cancer in mice. This is absolutely fine, so long as your experiments give a clear answer to the question and you can show that your experiments were performed fairly it doesn't matter whether your thesis turns out to be incorrect or correct (in so far as you have tested it). It may also be that your evaluation is inconclusive, which is also acceptable, so long as your experimental method is good and you can say exactly what further work is necessary to produce a definite result, you will be fine.<p /> Alternatively, you might phrase your thesis as a <b>research question</b>. In which case, instead of having a thesis such as water causes cancer in mice you would ask the question <i>does water cause cancer in mice</i> and your dissertation would describe your efforts to answer that question.<p /> <b><span style="font-size: large;">The shape of your dissertation and where the literature fits in</span></b><p />Every dissertation is slightly different, but good dissertations will all contain the same elements. I should say that the advice given in this sections is likely only relevant to science based projects. If you are working in the arts or some areas in the humanities then the expectations of you may well be very different. Still, a good dissertation in the sciences will contain roughly the elements listed below. I say "roughly" because, depending on the exact nature of your work, it may be sensible to expand some sections into two chapters rather than one, or to coalesce some elements into a single chapter. Your supervisor can give you more specific advice on this.<p /> <ul><li><b>Introduction:</b> should introduce the reader to the broad context of the research and explain why this is an interesting area to work in. So, if your thesis is something to do with mobile computing, you might say something here about why mobile phones are important, why mobile computing is an interesting and important area, and broadly what other researchers are working on. At the end of the chapter you will want to introduce your specific research question, having said why the area you are working in (and therefore your question) is important.</li> <li><b>Literature review:</b> Now you have introduced the reader (who will likely not be an expert in your exact area) to the broad research agenda in the field, and your research question, you can start writing more specifically about your own project. In this chapter you will survey the work that other researchers have done to answer your research question, or related questions. At the end of the chapter you should briefly explain how your own work builds on and differs from the work that has gone before it.</li> <li><b>Method:</b> this chapter should describe what you did to answer your research question (or to support your thesis, if you think of it that way), and how you went about it. You should describe your work in sufficient detail that another researcher could recreate your work to check your results.</li> <li><b>Evaluation:</b> here, you should evaluate what you have done, and say what answer (to your research question) you have arrived at. It may be that in your method you describe some experiments, and this section records your results and analysis of those results. This is an important section -- most students gain or lose marks in either their literature review or evaluation. Key to producing a convincing evaluation is to plan very early in the project what information you will need to write this section. More on that in another blog post.</li> <li><b>Conclusions:</b> should summarise what you have done and how you answered the research question. It may be that your work produced a very clear answer to the question, or it may be that your work points to a need for further research to clarify or confirm your answer. You should refer back to the literature review and summarise how your research differs from (hopefully improves on) the work described in the literature. Make sure you also say what research you would do if you were to continue working on your project.</li> <li><b>References:</b> a list of publications cited in the main text, in Harvard style or similar format.</li></ul>It is likely that most chapters will be roughly the same size, although the introductory chapter and conclusions are usually slightly shorter than the others. Try to let the lengths of each chapter be guided by the amount of useful and important information you have to convey to the reader, don't impose artificial word limits on yourself.<p /> <div><b><span style="font-size: large;">Summaries and synthesis: what should go in your literature review</span></b><p />Poor literature reviews often take the same form -- they tend to be a (usually short) list of papers that the student has read, briefly summarised. This is not really what is expected and will not gain high marks. Another common mistake is to review literature that has been used to inform some part of the practical work of the project, rather than to review work that has answered the same or related research questions. To do better, your writing needs to not only <i>summarise</i> the prior art in your area, but also <i>synthesise</i> what is in the literature. In fact, synthesis is one of the key skills that we expect to see from final year students.</div> <p /><div>So, what is synthesis? The main idea is that you should have understood the literature you have read and, more importantly, you should show that you understand the relationships between items of literature. That means what came first in your field, how it influenced later work, how each step forward in the research improved upon what came before it, and so on. Ideally, you will present your own view of the work you are describing. This partly means that you should be critical of the literature you read, and say where the shortcomings of the work are, and how the work could be improved upon (in particular how <i>your</i> work will improve on the prior art). Also, you might have your own view on where your area of research is likely to go in the future.<p /> Critiquing the work of others is something that is often new to students in their final year. One of the most frequent mistakes I see from students is to criticise the style of the papers they read, rather than the research that those papers describe. Avoid writing things like "this paper is not well written" or "this paper is hard to understand". A literature review should really be a review of the research work that has gone before you, not a literary criticism of the style that other authors adopt.<p /> <b><span style="font-size: large;">Practical matters: how to start, how to finish and how to do the bit in the middle</span></b><p />Reading and understanding the work of others is a lifetimes work for professional researchers, it is not something that starts and stops on particular dates, according to a Gantt chart. Your final year project will have a hand in deadline, so you need to be a little more circumscribed about how work. </div> <p /><div>Ideally, you should be reading some literature in your field very early on in your project, to help you choose a good topic and write an initial research proposal. I would suggest that you consider this to be the starting point for your literature review and keep on reading and adding to your writing all the way through your project until you hand in your final dissertation. To do this, I suggest you do two things. Firstly, keep a careful log of what you read in a format you find easy to work with. This might be a a log book on paper, or it might be a file on your computer, whatever works best for you. Each entry should include the title of the work you have read and enough information about the authors and so on that you can find the publication again. You should then summarise the work in the paper, including the research question answered by the work, the nature of the answer and the methodology of the research (i.e. what the authors actually did). This will give you a couple of advantages -- you won't forget anything you read because you have a record of it, your literature review can be written from your notes and if you are asked any awkward questions in a viva you can refer back to your log. Secondly, as soon as you feel you have read enough to understand the broad context of the literature, start writing it up formally as your second dissertation chapter. This should really be within two or three months of your starting date. Then, as the project progresses and you read more, you can integrate your new reading into your already drafted chapter. This might seem like a lot of effort early on, but when you come to write up your work, you will be incredibly grateful that your most time consuming chapter has already been written, when it was fresh in your mind, leaving you free to write up the later sections of your work.<p /> <b><span style="font-size: large;">An example of good writing</span></b><p />Now you know what a literature review is for, how it fits into your dissertation and how to go about writing your own, it would probably be useful to see an example of (part of) an example review. The paragraphs below give such an example and the text [in italics] is some commentary to explain how each part of the writing contributes towards the start of a good thesis chapter. When you read this, don't worry too much about the subject matter, just try to concentrate on the style of writing and the structure of the text. <p /> <blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"> The area of pervasive, or ubiquitous, computing was founded by Wieser (1991) <i>[ referenced] </i>who predicted that computers would one day be integrated into everyday objects and interact with people seamlessly. Although few such products are available today Weiser’s work has led to the creation of a number of research areas, including ambient intelligence (Eli and Epstein 1998), smart dust (Khan et al, 1999) and the Internet of Things (Brickley et al, 2001). <i>[Sets the historical context of the area and defines related areas.]</i></blockquote> <blockquote class="posterous_short_quote"> <br /></blockquote><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex;"> An early application of pervasive computing was the active badge location system, described by Want et al (1992), in which users and objects were tagged with an "active" badge which could locate and identify them. This system was based on ultrasound locationing, whereas later systems might use RFID technology to achieve the same effect. <i>[describes how the field has changed over time]</i> Uses of the active badge system included routing phone calls, email alerts and so on to the physical location of the receiver. <i>[contextualises the fundamental research]</i></blockquote> <blockquote class="posterous_short_quote"> </blockquote><blockquote class="posterous_short_quote"> ...</blockquote></div> <p style="font-size: 10px;"> <a href="http://posterous.com">Posted via email</a> from <a href="http://snim2.posterous.com/how-to-write-a-literature-review-for-your-fin">snim2's posterous</a> </p> Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-80941788102781067382009-08-06T15:15:00.000-07:002009-08-06T15:45:51.210-07:00Understanding Python Error Messages<p><span class="Apple-style-span" style="font-size: medium;">Understanding runtime errors and (uncaught) exceptions in any programming language can be a pain, especially if your code is complex or the error message is obscure. The usual way to deal with this situation is either to use a full blown debugger to step through the code, or to add as many print statements as necessary to uncover the source of the error. However, Python provides a third solution which is pretty neat -- use a disassembler. The <a href="http://docs.python.org/library/dis.html#module-dis">dis module</a> takes a Python bytecode object (as generated by the builtin compile function or the <a href="http://docs.python.org/library/py_compile.html">py_compile module</a>) and prints out a listing of the bytecode instructions "in" that object. However, dis also has another use -- calling the disassembler with no arguments prints out the bytecode instructions generated during the last traceback.</span></p>
<p>
<span class="Apple-style-span" style="font-size: medium;">For example, if you import dis in the interactive interpreter and generate a traceback, like this: </span>
</p>
<pre class="brush: python">
>>> 'foobar' * 2.5
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type 'float'
>>>
</pre>
<p>
<span class="Apple-style-span" style="font-size: medium;">
You can then run the <a href="http://docs.python.org/library/dis.html#module-dis">dis.dis()</a> method to examine the error:
</span>
</p>
<pre class="brush: python">
>>> dis.dis()
1 0 LOAD_CONST 0 ('foobar')
3 LOAD_CONST 1 (2.5)
--> 6 BINARY_MULTIPLY
7 PRINT_EXPR
8 LOAD_CONST 2 (None)
11 RETURN_VALUE
>>></pre>
<p>
<span class="Apple-style-span" style="font-size: medium;">
The arrow on the left (-->) points to the bytecode instruction which caused the TypeError. The number 0 on the left before load_const shows the line number of the source which generated the load_const bytecode instruction. On the right hand side in brackets are the constants loaded into the interpreter.</span>
</p>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-82217160031859230762009-07-12T16:12:00.000-07:002009-07-12T16:38:32.180-07:00Shift LIfe<object height="344" width="425"><param name="movie" value="http://www.youtube.com/v/67uip4iBKNM&hl=en&fs=1&rel=0"><param name="allowFullScreen" value="true"><param name="allowscriptaccess" value="always"><embed src="http://www.youtube.com/v/67uip4iBKNM&hl=en&fs=1&rel=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="344" width="425"></embed></object>
<a href="http://www.samanthamoore.co.uk/">Sam Moore</a>, <a href="http://www.opennature.org">Eugene Ch'ng</a>, Dew Harrison, Mat Murray and I have been working on a pervasive interface for an artificial life simulation. At the recent <a href="http://www.shift-time.org.uk/events/shift-life.shtml">Shift-Time festival</a> in Shrewsbury we exhibited an artificial life simulation of an fictional ecosystem, projected onto a sand pit. People could change the behaviour of the creatures in the ecosystem by changing the environmental conditions of the system. They could make the sun shine more or less by playing with a lamp, increase the
humidity or change the pH by pouring in water, vinegar or soda mix from watering cans or cause an earthquake by hitting the side of the sand pit with a toy hammer.
We had really good feedback from the people who came to see us. One family came back on the second day because their three children were talking about it "all night". Typical comments from kids were "I think it's cool" and one kid left saying "well, you've got to be impressed with that", which made us laugh.
More info and an interview with Dew can be found here:
[Event listing] <a href="http://www.shift-time.org.uk/events/shift-life.shtml" target="_blank">http://www.shift-time.org.uk/<wbr>events/shift-life.shtml</a>
[Interview] <a href="http://www.shift-time.org.uk/video/video-shift-life.shtml" target="_blank">http://www.shift-time.org.uk/<wbr>video/video-shift-life.shtml</a>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-48039404962863724902008-09-13T16:08:00.000-07:002009-07-12T05:20:04.608-07:00Leeds University at PyConUK 2008<span style="font-family:arial;"><a href="http://www.pyconuk.org/speaker_bios.html#tony_jenkins">Tony Jenkins</a> and <a href="http://www.pyconuk.org/speaker_bios.html#nick_efford">Nick Efford</a> from Leeds University</span> gave an excellent talk at PyConUK on their experiences of teaching Python as an introductory programming language which seems to be very similar to our efforts at Coventry. Tony and Nick managed to raise pass rates, inspire some fantastic coursework, have fun and generally kick ass. Great news for Python and even better news for a future generation of students. You can see some more of their work in <a href="http://www.ics.heacademy.ac.uk/italics/vol3iss2.htm">ITALICS</a>.<br /><br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.pyconuk.org/"><img style="cursor: pointer; width: 200px;" src="http://pyconuk.org/images/get-pythonized.png" alt="" border="0" /></a>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0tag:blogger.com,1999:blog-6743221205429103305.post-7147320421793604652007-03-17T01:31:00.000-07:002009-07-12T05:20:05.031-07:00Programming skillz and games degrees<span style="font-family: arial;"><a href="http://cogentcomputing.org/?item=/staff//people/bob">Bob</a> found a really interesting article on <a href="http://www.gamecareerguide.com/features/350/what_game_companies_want_from_.php?page=1">What Game Companies Want From Graduates</a>. Interesting, for a number of reasons, but the one sentence that stands out for anyone teaching programming is this:<br /><br /></span><span style="font-family:arial,helvetica,sans-serif;font-size:85%;">Currently for <a href="http://www.ea.com">EA</a>, the majority of "open positions for new graduates are software engineering and technical artist roles," though "both require substantial programming abilities." </span><br /><br /><br /><span style="font-family: arial;">Programming is, <a href="http://www.ea.com">EA</a> say, important both for programmers and non-programmers alike, no doubt for a bunch of reasons ranging from needing to communicate effectively with the whole team to needing to script and extend modelling and animation tools.<br /><br />It's an important point because applications to core CS and Soft Eng degrees are falling world-wide, with interest in degrees such as <a href="http://www.coventry.ac.uk/courses/course-a-z/a/544">Creative Computing</a> and <a href="http://www.coventry.ac.uk/courses/all-courses-by-subject/computer-games/a/545">Games Technology</a> rising. With fewer students opting to take A Levels in Maths and the physical sciences the need to develop core technical skills needs to be clearly seen as fun, important and leading to jobs in a way that was never needed by those of us who grew up hacking the <a href="http://en.wikipedia.org/wiki/Amstrad_CPC">Amstrad6128</a>.<br /></span>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com2tag:blogger.com,1999:blog-6743221205429103305.post-52236618855667703152006-12-28T03:40:00.000-08:002009-07-12T05:20:05.041-07:00How to learn a new (programming) language<p style="font-family: arial;">Pretty much every programmer that I've ever met learns new languages by writing a number of small programs in the new language, that should show up the major features of the language and enable the transference of skills from known languages to new ones. Here's a list of my favourite small problems:<br /></p><p style="font-family: arial; font-weight: bold;">The basics: choice, iteration, recursion</p><dl style="font-family: arial;"><dt>Factorial function</dt><dd><a href="http://en.wikipedia.org/wiki/Factorial">Factorials</a> are easy, but the trick here is to deal with all the various boundary conditions, preferably using exceptions.<br /></dd><br /><dt>Fibonacci sequence<br /></dt><dd>Generating the next <a href="http://en.wikipedia.org/wiki/Fibonacci_sequence">Fibonnaci number</a> has a simple recursive solution and a slightly more complex iterative solution which can show up features such as simultaneous assignment.<br /></dd><br /><dt>The first <em>n</em> primes</dt><dd>Print the first <em>n</em> primes using the<br /><a href="http://en.wikipedia.org/wiki/Eratosthenes_Sieve">Sieve of Eratosthenes</a>. This is an interesting one -- it has nice solutions both iteratively and recursively. Also, you can do neet things with exceptions to give a solution.<br /></dd><br /></dl><p style="font-family: arial; font-weight: bold;">Files and other I/O</p><dl style="font-family: arial;"><br /><dt>Caesar cipher<br /></dt><dd>Read in an ASCII sentence and encipher it with the Caesar cipher (add a key to each letter) and print out the enciphered text. Write the converse function to decipher.<br /></dd><br /><dt>Count the occurances of letter 'a' in a file</dt><dd>Read a file name in on the console, open the file for reading and count the occurances of 'a' in the file. Print the result (and close the file!).<br /></dd><br /></dl><p style="font-family: arial; font-weight: bold;">Linear data structures: arrays and so on</p><dl style="font-family: arial;"><br /><dt>Binary search<br /></dt><dd>Look for a value in a sorted structure -- iterative or recursive solutions are both interesting to try out.<br /></dd><br /><dt>Bubble sort<br /></dt><dd>The simplist sorting algorithm, but it should give a reasonable idea of how to manipulate mutable structures, or deal with immutable ones if that's all the language has available.<br /></dd><br /></dl><p style="font-family: arial; font-weight: bold;">Modularity: modules, classes, objects, etc.</p><dl style="font-family: arial;"><dt>Sets data structure</dt><dd>Sets are a simple data structure to implement, they're easy to test and a good instroduction to polymorphism. Union, difference, intersection, etc. all make useful methods and you can play about with mutable or immutable sets and see the difference.<br /></dd></dl>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com1tag:blogger.com,1999:blog-6743221205429103305.post-43948677565078745282006-10-11T13:15:00.000-07:002009-07-12T05:20:05.068-07:00Why Linux is such a great choice for multimedia computing<a style="font-family: arial;" href="http://linuxhelp.blogspot.com/">All about Linux</a><span style="font-family: arial;"> has a great </span><a style="font-family: arial;" href="http://linuxhelp.blogspot.com/2006/10/unique-relationship-between-hollywood.html">post on the use of Linux in the film industry</a><span style="font-family: arial;">. Check it out!</span>Sarah Mounthttp://www.blogger.com/profile/05224625280152037294noreply@blogger.com0