msc-projects-13.html
changeset 253 f4b73afc6007
child 254 9e2d4f273191
equal deleted inserted replaced
252:486a18ae359d 253:f4b73afc6007
       
     1 <?xml version="1.0" encoding="utf-8"?>
       
     2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       
     3 <HEAD>
       
     4 <TITLE>2013/14 Msc Projects</TITLE>
       
     5 <BASE HREF="http://www.inf.kcl.ac.uk/staff/urbanc/">
       
     6 <script type="text/javascript" src="striper.js"></script>
       
     7 <link rel="stylesheet" href="nominal.css">
       
     8 <script type="text/javascript" src="https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
       
     9 </script>
       
    10 </HEAD>
       
    11 <BODY TEXT="#000000" 
       
    12       BGCOLOR="#4169E1" 
       
    13       LINK="#0000EF" 
       
    14       VLINK="#51188E" 
       
    15       ALINK="#FF0000"
       
    16       ONLOAD="striper('ul','striped','li','first,second')">
       
    17 
       
    18 
       
    19 
       
    20 <TABLE WIDTH="100%" 
       
    21        BGCOLOR="#4169E1" 
       
    22        BORDER="0"   
       
    23        FRAME="border"  
       
    24        CELLPADDING="10"     
       
    25        CELLSPACING="2"
       
    26        RULES="all">
       
    27 
       
    28 <TR>
       
    29 <TD BGCOLOR="#FFFFFF" 
       
    30     WIDTH="75%" 
       
    31     VALIGN="TOP">
       
    32 
       
    33 <H2>2013/14 MSc Projects</H2>
       
    34 <H4>Supervisor: Christian Urban</H4> 
       
    35 <H4>Email: christian dot urban at kcl dot ac dot uk,  Office: Strand Building S1.27</H4>
       
    36 <H4>If you are interested in a project, please send me an email and we can discuss details. Please include
       
    37 a short description about your programming skills and Computer Science background in your first email. 
       
    38 I will also need your King's username in order to book the project for you. Thanks.</H4> 
       
    39 
       
    40 <H4>Note that besides being a lecturer at the theoretical end of Computer Science, I am also a passionate
       
    41     <A HREF="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacker</A> &hellip;
       
    42     defined as &ldquo;a person who enjoys exploring the details of programmable systems and 
       
    43     stretching their capabilities, as opposed to most users, who prefer to learn only the minimum 
       
    44     necessary.&rdquo; I am always happy to supervise like-minded students.</H4>  
       
    45 
       
    46 <ul class="striped">
       
    47 <li> <H4>[CU1] Regular Expression Matching and Partial Derivatives</H4>
       
    48 
       
    49   <p>
       
    50   <B>Description:</b>  
       
    51   <A HREF="http://en.wikipedia.org/wiki/Regular_expression">Regular expressions</A> 
       
    52   are extremely useful for many text-processing tasks such as finding patterns in texts,
       
    53   lexing programs, syntax highlighting and so on. Given that regular expressions were
       
    54   introduced in 1950 by <A HREF="http://en.wikipedia.org/wiki/Stephen_Cole_Kleene">Stephen Kleene</A>,
       
    55   you might think regular expressions have since been studied and implemented to death. But you would definitely be
       
    56   mistaken: in fact they are still an active research area. For example
       
    57   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">this paper</A> 
       
    58   about regular expression matching and partial derivatives was presented last summer at the international 
       
    59   PPDP'12 conference. They even work on a followup paper that has not yet been presented at any
       
    60   conference. The task in this project is to implement their results.</p>
       
    61 
       
    62   <p>The background for this project is that some regular expressions are 
       
    63   &ldquo;<A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">evil</A>&rdquo;
       
    64   and can &ldquo;stab you in the back&rdquo; according to
       
    65   this <A HREF="http://tech.blog.cueup.com/regular-expressions-will-stab-you-in-the-back">blog post</A>.
       
    66   For example, if you use in <A HREF="http://www.python.org">Python</A> or 
       
    67   in <A HREF="http://www.ruby-lang.org/en/">Ruby</A> (probably also other mainstream programming languages) the 
       
    68   innocently looking regular expression <code>a?{28}a{28}</code> and match it, say, against the string 
       
    69   <code>aaaaaaaaaaaaaaaaaaaaaaaaaaaa</code> (that is 28 <code>a</code>s), you will soon notice that your CPU usage goes to 100%. In fact,
       
    70   Python and Ruby need approximately 30 seconds of hard work for matching this string. You can try it for yourself:
       
    71   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/progs/re.py">re.py</A> (Python version) and 
       
    72   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/progs/re.rb">re.rb</A> 
       
    73   (Ruby version). You can imagine an attacker
       
    74   mounting a nice <A HREF="http://en.wikipedia.org/wiki/Denial-of-service_attack">DoS attack</A> against 
       
    75   your program if it contains such an &ldquo;evil&rdquo; regular expression. Actually 
       
    76   <A HREF="http://www.scala-lang.org/">Scala</A> (and also Java) are almost immune from such
       
    77   attacks as they can deal with strings of up to 4,300 <code>a</code>s in less than a second. But if you scale
       
    78   the regular expression and string further to, say, 4,600 <code>a</code>s, then you get a <code>StackOverflowError</code> 
       
    79   potentially crashing your program.
       
    80   </p>
       
    81 
       
    82   <p>
       
    83   On a rainy afternoon, I implemented 
       
    84   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/progs/re3.scala">this</A> 
       
    85   regular expression matcher in Scala. It is not as fast as the official one in Scala, but
       
    86   it can match up to 11,000 <code>a</code>s in less than 5 seconds  without raising any exception
       
    87   (remember Python and Ruby both need nearly 30 seconds to process 28(!) <code>a</code>s, and Scala's
       
    88   official matcher maxes out at 4,600 <code>a</code>s). My matcher is approximately
       
    89   85 lines of code and based on the concept of 
       
    90   <A HREF="http://lambda-the-ultimate.org/node/2293">derivatives of regular expressions</A>.
       
    91   These derivatives were introduced in 1964 by <A HREF="http://en.wikipedia.org/wiki/Janusz_Brzozowski_(computer_scientist)">
       
    92   Janusz Brzozowski</A>, but according to this 
       
    93   <A HREF="http://www.cl.cam.ac.uk/~so294/documents/jfp09.pdf">paper</A> had been lost in the &ldquo;sands of time&rdquo;.
       
    94   The advantage of derivatives is that they side-step completely the usual 
       
    95   <A HREF="http://hackingoff.com/compilers/regular-expression-to-nfa-dfa">translations</A> of regular expressions
       
    96   into NFAs or DFAs, which can introduce the exponential behaviour exhibited by the regular
       
    97   expression matchers in Python and Ruby.
       
    98   </p>
       
    99 
       
   100   <p>
       
   101   Now the authors from the 
       
   102   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">PPDP'12-paper</A> mentioned 
       
   103   above claim they are even faster than me and can deal with even more features of regular expressions
       
   104   (for example subexpression matching, which my rainy-afternoon matcher cannot). I am sure they thought
       
   105   about the problem much longer than a single afternoon. The task 
       
   106   in this project is to find out how good they actually are by implementing the results from their paper. 
       
   107   Their approach is based on the concept of partial derivatives introduced in 1994 by
       
   108   <A HREF="http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.56.2509&rep=rep1&type=pdf">Valentin Antimirov</A>.
       
   109   I used them once myself in a <A HREF="http://www.inf.kcl.ac.uk/staff/urbanc/Publications/rexp.pdf">paper</A> 
       
   110   in order to prove the <A HREF="http://en.wikipedia.org/wiki/Myhill–Nerode_theorem">Myhill-Nerode theorem</A>.
       
   111   So I know they are worth their money. Still, it would be interesting to actually compare their results
       
   112   with my simple rainy-afternoon matcher and potentially &ldquo;blow away&rdquo; the regular expression matchers 
       
   113   in Python and Ruby (and possibly in Scala too).
       
   114   </p>
       
   115 
       
   116   <p>
       
   117   <B>Literature:</B> 
       
   118   The place to start with this project is obviously this
       
   119   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">paper</A>.
       
   120   Traditional methods for regular expression matching are explained
       
   121   in the Wikipedia articles 
       
   122   <A HREF="http://en.wikipedia.org/wiki/DFA_minimization">here</A> and 
       
   123   <A HREF="http://en.wikipedia.org/wiki/Powerset_construction">here</A>.
       
   124   The authoritative <A HREF="http://infolab.stanford.edu/~ullman/ialc.html">book</A>
       
   125   on automata and regular expressions is by John Hopcroft and Jeffrey Ullmann (available in the library). 
       
   126   There is also an online course about this topic by Ullman at 
       
   127   <A HREF="https://www.coursera.org/course/automata">Coursera</A>, though IMHO not 
       
   128   done with love. 
       
   129   Finally, there are millions of other pointers about regular expression
       
   130   matching on the Web. I found the chapter on Lexing in this
       
   131   <A HREF="http://www.diku.dk/~torbenm/Basics/">online book</A> very helpful.
       
   132   Test cases for &ldquo;<A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">evil</A>&rdquo;
       
   133   regular expressions can be obtained from <A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">here</A>.
       
   134   </p>
       
   135 
       
   136   <p>
       
   137   <B>Skills:</B> 
       
   138   This is a project for a student with an interest in theory and some
       
   139   reasonable programming skills. The project can be easily implemented
       
   140   in functional languages like
       
   141   <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   142   F#, 
       
   143   <A HREF="http://en.wikipedia.org/wiki/Standard_ML">ML</A>,  
       
   144   <A HREF="http://haskell.org/haskellwiki/Haskell">Haskell</A>, etc. Python and other non-functional languages
       
   145   can be also used, but seem much less convenient.
       
   146   </p>
       
   147   
       
   148 <li> <H4>[CU2] A Compiler for a Simple Programming Language</H4>
       
   149 
       
   150   <p>
       
   151   <b>Description:</b> 
       
   152   Compilers translate high-level programs that humans can read and write into
       
   153   efficient machine code that can be run on a CPU or virtual machine.
       
   154   A compiler for a simple functional language generating X86 code is described
       
   155   <A HREF="https://github.com/chameco/Shade">here</A>.
       
   156   I recently implemented a very simple compiler for an even simpler functional
       
   157   programming language following this 
       
   158   <A HREF="http://www.cs.princeton.edu/~dpw/papers/tal-toplas.pdf">paper</A> 
       
   159   (also described <A HREF="http://www.cs.princeton.edu/~dpw/papers/tal-tr.pdf">here</A>).
       
   160   My code, written in <A HREF="http://www.scala-lang.org/">Scala</A>, of this compiler is 
       
   161   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/compiler.scala">here</A>.
       
   162   The compiler can deal with simple programs involving natural numbers, such
       
   163   as Fibonacci numbers or factorial (but it can be easily extended - that is not the point).
       
   164   </p>
       
   165 
       
   166   <p>
       
   167   While the hard work has been done (understanding the two papers above),
       
   168   my compiler only produces some idealised machine code. For example I
       
   169   assume there are infinitely many registers. The goal of this
       
   170   project is to generate machine code that is more realistic and can
       
   171   run on a CPU, like X86, or run on a virtual machine, say the JVM. 
       
   172   This gives probably a speedup of thousand times in comparison to
       
   173   my naive machine code and virtual machine. The project
       
   174   requires to dig into the literature about real CPUs and generating 
       
   175   real machine code. 
       
   176   </p>
       
   177 
       
   178   <p>
       
   179   An alternative is to not generate machine code, but build a compiler that compiles
       
   180   <A HREF="http://www.w3schools.com/js/">JavaScript</A>. This is the language that is supported by most
       
   181   browsers and therefore is a favourite
       
   182   vehicle for Web-programming. Some call it <B>the</B> scripting language of the Web.
       
   183   Unfortunately, JavaScript is probably one of the worst
       
   184   languages to program in (being designed and released in a hurry). <B>But</B> it can be used as a convenient target
       
   185   for translating programs from other languages. In particular there are two
       
   186   very optimised subsets of JavaScript that can be used for this purpose:
       
   187   one is <A HREF="http://asmjs.org">asm.js</A> and the other is
       
   188   <A HREF="https://github.com/kripken/emscripten/wiki">emscripten</A>.
       
   189   There is a <A HREF="https://github.com/kripken/emscripten/wiki/Tutorial">tutorial</A> for emscripten
       
   190   and an impressive <A HREF="http://www.unrealengine.com/html5/">demo</A> which runs the
       
   191   <A HREF="http://en.wikipedia.org/wiki/Unreal_Engine">Unreal Engine 3</A>
       
   192   in a browser with spectacular speed. This was achieved by compiling the
       
   193   C-code of the Unreal Engine to the LLVM intermediate language and then translating the LLVM
       
   194   code to JavaScript.
       
   195   </p>
       
   196 
       
   197   <p>
       
   198   <B>Literature:</B>
       
   199   There is a lot of literature about compilers 
       
   200   (for example <A HREF="http://www.cs.princeton.edu/~appel/papers/cwc.html">this book</A> -
       
   201   I can lend you my copy for the duration of the project, or this
       
   202   <A HREF="http://www.diku.dk/~torbenm/Basics/">online book</A>). A very good overview article
       
   203   about implementing compilers by 
       
   204   <A HREF="http://tratt.net/laurie/">Laurie Tratt</A> is 
       
   205   <A HREF="http://tratt.net/laurie/tech_articles/articles/how_difficult_is_it_to_write_a_compiler">here</A>.
       
   206   An online book about the Art of Assembly Language is
       
   207   <A HREF="http://flint.cs.yale.edu/cs422/doc/art-of-asm/pdf/">here</A>.
       
   208   An introduction into x86 machine code is <A HREF="http://ianseyler.github.com/easy_x86-64/">here</A>.
       
   209   Intel's official manual for the x86 instruction is 
       
   210   <A HREF="http://download.intel.com/design/intarch/manuals/24319101.pdf">here</A>. 
       
   211   A simple assembler for the JVM is described <A HREF="http://jasmin.sourceforge.net">here</A>.
       
   212   An interesting twist of this project is to not generate code for a CPU, but
       
   213   for the intermediate language of the <A HREF="http://llvm.org">LLVM</A> compiler
       
   214   (also described <A HREF="https://wiki.aalto.fi/display/t1065450/LLVM+IR">here</A> and
       
   215   <A HREF="http://llvm.org/docs/LangRef.html">here</A>). If you want to see
       
   216   what machine code looks like you can compile your C-program using gcc -S.
       
   217   </p>
       
   218   <p>
       
   219   If JavaScript is chosen as a target instead, then there are plenty of <A HREF="http://www.w3schools.com/js/">tutorials</A> on the Web.
       
   220   <A HREF="http://jsbooks.revolunet.com">Here</A> is a list of free books on JavaScript.
       
   221   A project from which you can draw inspiration is this
       
   222   <A HREF="http://jlongster.com/2012/01/04/outlet-my-lisp-to-javascript-experiment.html">List-to-JavaScript</A>
       
   223   translator. <A HREF="https://bitbucket.org/ktg/parenjs/overview">Here</A> is another such project.
       
   224   And <A HREF="https://github.com/viclib/liscript">another</A> in less than 100 lines of code.
       
   225   <A HREF="http://en.wikipedia.org/wiki/CoffeeScript">Coffeescript</A> is a similar project
       
   226   except that it is already quite <A HREF="http://coffeescript.org">mature</A>. And finally not to
       
   227   forget <A HREF="http://www.typescriptlang.org">TypeScript</A> developed by Microsoft. The main
       
   228   difference between these projects and this one is that they translate int relatively high-level
       
   229   JavaScript code; none of them use the much lower levels <A HREF="http://asmjs.org">asm.js</A> and 
       
   230   <A HREF="https://github.com/kripken/emscripten/wiki">emscripten</A>.
       
   231   </p>
       
   232 
       
   233   <p>
       
   234   <B>Skills:</B> 
       
   235   This is a project for a student with a deep interest in programming languages and
       
   236   compilers. Since my compiler is implemented in <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   237   it would make sense to continue this project in this language. I can be
       
   238   of help with questions and books about <A HREF="http://www.scala-lang.org/">Scala</A>.
       
   239   But if Scala is a problem, my code can also be translated quickly into any other functional
       
   240   language. 
       
   241   </p>
       
   242 
       
   243   <p>
       
   244   <B>PS:</B> Compiler projects like this one consistently received high marks in the past.
       
   245   I suprvised four so far and none of them received a mark below 70% - one even was awarded a prize.
       
   246   </p>
       
   247 
       
   248 <li> <H4>[CU3] Slide-Making in the Web-Age</H4>
       
   249 
       
   250   <p>
       
   251   The standard technology for writing scientific papers in Computer Science  is to use
       
   252   <A HREF="http://en.wikipedia.org/wiki/LaTeX">LaTeX</A>, a document preparation
       
   253   system originally implemented by <A HREF="http://en.wikipedia.org/wiki/Donald_Knuth">Donald Knuth</A>
       
   254   and <A HREF="http://en.wikipedia.org/wiki/Leslie_Lamport">Leslie Lamport</A>.
       
   255   LaTeX produces very pleasantly looking documents, can deal nicely with mathematical
       
   256   formulas and is very flexible. If you are interested <A HREF="http://openwetware.org/wiki/Word_vs._LaTeX">here</A>
       
   257   is a side-by-side comparison between Word and LaTeX (which LaTeX &ldquo;wins&rdquo; with 18 out of 21 points).
       
   258   Computer scientists not only use LaTeX for documents,
       
   259   but also for slides (really, nobody who wants to be cool uses Keynote or Powerpoint).
       
   260   </p>
       
   261 
       
   262   <p>
       
   263   Although used widely, LaTeX seems nowadays a bit dated for producing
       
   264   slides. Unlike documents, which are typically &ldquo;static&rdquo; and published in a book or journal,
       
   265   slides often contain changing contents that might first only be partially visible and
       
   266   only later be revealed as the &ldquo;story&rdquo; of a talk or lecture demands.
       
   267   Also slides often contain animated algorithms where each state in the
       
   268   calculation is best explained by highlighting the changing data.
       
   269   </p>
       
   270 
       
   271   <p>
       
   272   It seems HTML and JavaScript are much better suited for generating
       
   273   such animated slides. This <A HREF="http://www.impressivewebs.com/html-slidedeck-toolkits/">page</A>
       
   274   links to 22 slide-generating programs using this combination of technologies. 
       
   275   <A HREF="http://www.impressivewebs.com/html-slidedeck-toolkits/">Here</A> are even more such
       
   276   projects. However, the problem with all of these project is that they depend heavily on the users being
       
   277   able to write JavaScript, CCS or HTML...not something one would like to depend on given that
       
   278   &ldquo;normal&rdquo; users likely only have a LaTeX background. The aim of this project is to invent a
       
   279   very simple language that is inspired by LaTeX and then generate from code written in this language
       
   280   slides that can be displayed in a web-browser.
       
   281   </p>
       
   282 
       
   283  <p>
       
   284  This sounds complicated, but there is already some help available:
       
   285  <A HREF="http://www.mathjax.org">Mathjax</A> is a JavaScript library that can
       
   286  be used to display mathematical text, for example
       
   287 
       
   288  <blockquote>
       
   289  <p>When \(a \ne 0\), there are two solutions to \(ax^2 + bx + c = 0\) and they are
       
   290  \(x = {-b \pm \sqrt{b^2-4ac} \over 2a}\).</p>
       
   291  </blockquote>
       
   292 
       
   293  by writing code in the familiar LaTeX-way. This can be reused. There are also plenty of JavaScript
       
   294  libraries for graphical animations (for example
       
   295  <A HREF="http://raphaeljs.com">Raphael</A>,
       
   296  <A HREF="http://svgjs.com">SVG.JS</A>,
       
   297  <A HREF="http://bonsaijs.org">Bonsaijs</A>,
       
   298  <A HREF="http://jsxgraph.uni-bayreuth.de/wp/">JSXGraph</A>). The inspiration for how the user should be able to write
       
   299  slides could come from the LaTeX packages <A HREF="http://en.wikipedia.org/wiki/Beamer_(LaTeX)">Beamer</A>
       
   300  and <A HREF="http://en.wikipedia.org/wiki/PGF/TikZ">PGF/TikZ</A>.
       
   301  </p>
       
   302 
       
   303   <p>
       
   304   <B>Skills:</B> 
       
   305   This is a project requires good knowledge of JavaScript. You need to be able to
       
   306   parse a language and translate it to a suitable part of JavaScript using
       
   307   appropriate libraries. Tutorials for JavaScript are <A HREF="http://www.w3schools.com/js/">here</A>.
       
   308   A parser generator for JavaScript is <A HREF="http://pegjs.majda.cz">here</A>. There are probably also
       
   309   others.
       
   310   </p>
       
   311 
       
   312 <li> <H4>[CU4] An Online Student Voting System</H4>
       
   313 
       
   314   <p>
       
   315   <B>Description:</B>
       
   316   One of the more annoying aspects of giving a lecture is to ask a question
       
   317   to the students and no matter how easy the questions is to not 
       
   318   receive an answer. Recently, the online course system 
       
   319   <A HREF="http://www.udacity.com">Udacity</A> made an art out of
       
   320   asking questions during lectures (see for example the
       
   321   <A HREF="http://www.udacity.com/overview/Course/cs253/CourseRev/apr2012">Web Application Engineering</A> 
       
   322   course CS253).
       
   323   The lecturer there gives multiple-choice questions as part of the lecture and the students need to 
       
   324   click on the appropriate answer. This works very well in the online world. 
       
   325   For  &ldquo;real-world&rdquo; lectures, the department has some 
       
   326   <A HREF="http://en.wikipedia.org/wiki/Audience_response">clickers</A>
       
   327   (these are little devices part of an audience response systems). However, 
       
   328   they are a logistic nightmare for the lecturer: they need to be distributed 
       
   329   during the lecture and collected at the end. Nowadays, where students
       
   330   come with their own laptop or smartphone to lectures, this can
       
   331   be improved.
       
   332   </p>
       
   333 
       
   334   <p>
       
   335   The task of this project is to implement an online student
       
   336   polling system. The lecturer should be able to prepare 
       
   337   questions beforehand (encoded as some web-form) and be able to 
       
   338   show them during the lecture. The students
       
   339   can give their answers by clicking on the corresponding webpage.
       
   340   The lecturer can then collect the responses online and evaluate them 
       
   341   immediately. Such a system is sometimes called
       
   342   <A HREF="http://en.wikipedia.org/wiki/Audience_response#Smartphone_.2F_HTTP_voting">HTML voting</A>. 
       
   343   There are a number of commercial
       
   344   solutions for this problem, but they are not easy to use (in addition
       
   345   to being ridiculously expensive). A good student can easily improve upon
       
   346   what they provide. 
       
   347   </p>
       
   348 
       
   349   <p>
       
   350   The problem of student polling is not as hard as 
       
   351   <A HREF="http://en.wikipedia.org/wiki/Electronic_voting">electronic voting</A>, 
       
   352   which essentially is still an unsolved problem in Computer Science. The
       
   353   students only need to be prevented from answering question more than once thus skewing
       
   354   any statistics. Unlike electronic voting, no audit trail needs to be kept
       
   355   for student polling. Restricting the number of answers can probably be solved 
       
   356   by setting appropriate cookies on the students
       
   357   computers or smart phones.
       
   358   </p>
       
   359 
       
   360   <p>
       
   361   <B>Literature:</B> 
       
   362   The project requires fluency in a web-programming language (for example 
       
   363   <A HREF="http://en.wikipedia.org/wiki/JavaScript">Javascript</A>,
       
   364   <A HREF="http://en.wikipedia.org/wiki/Go_(programming_language)">Go</A>, 
       
   365   <A HREF="http://www.scala-lang.org/">Scala</A>). However JavaScript with
       
   366   the <A HREF="http://nodejs.org">Node.js</A> extension seems to be best suited for the job.
       
   367   <A HREF="http://www.nodebeginner.org">Here</A> is a tutorial on Node.js for beginners.
       
   368   For web-programming the 
       
   369   <A HREF="http://www.udacity.com/overview/Course/cs253/CourseRev/apr2012">Web Application Engineering</A>
       
   370   course at <A HREF="http://www.udacity.com">Udacity</A> is a good starting point 
       
   371   to be aware of the issues involved. This course uses <A HREF="http://www.python.org">Python</A>.
       
   372   To evaluate the answers from the students, Google's 
       
   373   <A HREF="https://developers.google.com/chart/image/docs/making_charts">Chart Tools</A>
       
   374   might be useful, which are also described in this 
       
   375   <A HREF="http://www.youtube.com/watch?v=NZtgT4jgnE8">youtube</A> video.
       
   376   </p>
       
   377 
       
   378   <p>
       
   379   <B>Skills:</B> 
       
   380   In order to provide convenience for the lecturer, this project needs very good web-programming skills. A 
       
   381   <A HREF="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacker mentality</A>
       
   382   (see above) is probably very beneficial: web-programming is an area that only emerged recently and
       
   383   many tools still lack maturity. You probably have to experiment a lot with several different
       
   384   languages and tools.
       
   385   </p>
       
   386 
       
   387 <li> <H4>[CU5] An Infrastructure for Displaying and Animating Code in a Web-Browser</H4>
       
   388   
       
   389 <p>
       
   390   <B>Description:</B>
       
   391   The project aim is to implement an infrastructure for displaying and
       
   392   animating code in a web-browser. The infrastructure should be agnostic
       
   393   with respect to the programming language, but should be configurable.
       
   394   I envisage something smaller than the projects 
       
   395   <A HREF="http://www.pythontutor.com">here</A> (for Python),
       
   396   <A HREF="http://ideone.com">here</A> (for Java),
       
   397   <A HREF="http://codepad.org">here</A> (for multiple languages),
       
   398   <A HREF="http://www.w3schools.com/html/tryit.asp?filename=tryhtml_intro">here</A> (for HTML)
       
   399   <A HREF="http://repl.it/languages/JavaScript">here</A> (for JavaScript),
       
   400   and <A HREF="http://www.scala-tour.com/#/welcome">here</A> (for Scala).
       
   401   </p>
       
   402 
       
   403   <p>
       
   404   The tasks in this project are being able (1) to lex and parse languages and (2) to write an interpreter.
       
   405   The goal is to implement this as much as possible in a language-agnostic fashion.
       
   406   </p>
       
   407 
       
   408   <p>
       
   409   <B>Skills:</B> 
       
   410   Good skill in lexing and language parsing, as well as being fluent with web programming (for
       
   411   example JavaScript).
       
   412   </p>
       
   413 
       
   414 
       
   415 <li> <H4>[CU6] Implementation of a Distributed Clock-Synchronisation Algorithm developed at NASA</H4>
       
   416   
       
   417   <p>
       
   418   <B>Description:</B>
       
   419   There are many algorithms for synchronising clocks. This
       
   420   <A HREF="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20120000054_2011025573.pdf">paper</A> 
       
   421   describes a new algorithm for clocks that communicate by exchanging
       
   422   messages and thereby reach a state in which (within some bound) all clocks are synchronised.
       
   423   A slightly longer and more detailed paper about the algorithm is 
       
   424   <A HREF="http://hdl.handle.net/2060/20110020812">here</A>.
       
   425   The point of this project is to implement this algorithm and simulate networks of clocks.
       
   426   </p>
       
   427 
       
   428   <p>
       
   429   <B>Literature:</B> 
       
   430   There is a wide range of literature on clock synchronisation algorithms. 
       
   431   Some pointers are given in this
       
   432   <A HREF="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20120000054_2011025573.pdf">paper</A>,
       
   433   which describes the algorithm to be implemented in this project. Pointers
       
   434   are given also <A HREF="http://en.wikipedia.org/wiki/Clock_synchronization">here</A>.
       
   435   </p>
       
   436 
       
   437   <p>
       
   438   <B>Skills:</B> 
       
   439   In order to implement a simulation of a network of clocks, you need to tackle
       
   440   concurrency. You can do this for example in the programming language
       
   441   <A HREF="http://www.scala-lang.org/">Scala</A> with the help of the 
       
   442   <A HREF="http://akka.io">Akka</a> library. This library enables you to send messages
       
   443   between different <I>actors</I>. <A HREF="http://www.scala-lang.org/node/242">Here</A> 
       
   444   are some examples that explain how to implement exchanging messages between actors. 
       
   445   </p>
       
   446 
       
   447 <li> <H4>[CU7] Raspberry Pis and Arduinos</H4>
       
   448 
       
   449   <p>
       
   450   <B>Description:</B>
       
   451   This project is for true hackers! <A HREF="http://en.wikipedia.org/wiki/Raspberry_Pi">Raspberry Pis</A>
       
   452   are small Linux computers the size of a credit-card and only cost &pound;34 (see picture left below). They were introduced
       
   453   in 2012 and people went crazy...well some of them. There is a
       
   454   <A HREF="https://plus.google.com/communities/113390432655174294208?hl=en">Google+</A> community about Raspberry Pis that has more
       
   455   than 58k of followers. It is hard to keep up with what people do with these small computers. The possibilities
       
   456   seem to be limitless. The main resource for Raspberry Pis is <A HREF="http://www.raspberrypi.org">here</A>.
       
   457   There are <A HREF="http://www.themagpi.com">magazines</A> dedicated to them and tons of
       
   458   <A HREF="http://www.raspberrypi.org/phpBB3/viewforum.php?f=39">books</A> (not to mention
       
   459   floods of <A HREF="https://www.google.co.uk/search?q=raspberry+pi">online</A> material).
       
   460   Google just released a
       
   461   <A HREF="http://googlecreativelab.github.io/coder/">framework</A>
       
   462   for web-programming and for turning Raspberry Pis into webservers.
       
   463   </p>
       
   464 
       
   465   <p>
       
   466   <A HREF="http://en.wikipedia.org/wiki/Arduino">Arduinos</A> are slightly older (from 2005) but still very cool (see picture right below). They
       
   467   are small single-board micro-controllers that can talk to various external gadgets (sensors, motors, etc). Since Arduinos
       
   468   are open-software and open-hardware there are many clones and add-on boards. Like for the Raspberry Pi, there
       
   469   is a lot of material <A HREF="https://www.google.co.uk/search?q=arduino">available</A> about Arduinos.
       
   470   The main reference is <A HREF="http://www.arduino.cc">here</A>. Like the Raspberry Pis, the good thing about
       
   471   Arduinos is that they can be powered with simple AA-batteries.
       
   472   </p>
       
   473 
       
   474   <p>
       
   475   I have two such Raspberry Pis including wifi-connectors and two <A HREF="http://www.raspberrypi.org/camera">cameras<A>.
       
   476   I also have two <A HREF="http://www.freaklabs.org/index.php/Blog/Store/Introducing-the-Freakduino-Chibi-An-Arduino-based-Board-For-Wireless-Sensor-Networking.html">Freakduino Boards</A> that are Arduinos extended with wireless communication. I can lend them to responsible
       
   477   students for one or two projects. However, the aim is to first come up with an idea for a project. Popular projects are
       
   478   automated temperature sensors, network servers, robots, web-cams (<A HREF="http://www.secretbatcave.co.uk/electronics/shard-rain-cam/">here</A>
       
   479   is a <A HREF="http://www.raspberrypi.org/archives/3547">web-cam</A> directed at the Shard that can
       
   480   <A HREF="http://www.secretbatcave.co.uk/software/shard-rain-cam-quantifying-cloudy/">tell</A>
       
   481   you whether it is raining or cloudy). There are plenty more ideas listed
       
   482   <A HREF="http://www.raspberrypi.org/phpBB3/viewforum.php?f=15">here</A> for Raspberry Pis and
       
   483   <A HREF="http://playground.arduino.cc/projects/ideas">here</A> for Arduinos.
       
   484   </p>
       
   485 
       
   486   <p>
       
   487   There are essentially two kinds of projects: One is purely software-based. Software projects for Raspberry Pis are often
       
   488   written in <A HREF="http://www.python.org">Python</A>, but since these are Linux-capable computers any other
       
   489   language would do as well. You can also write your own operating system as done
       
   490   <A HREF="http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/">here</A>. For example the students
       
   491   <A HREF="http://www.recantha.co.uk/blog/?p=4918">here</A> developed their own bare-metal OS and then implemented
       
   492   a chess-program on top of it (have a look at their very impressive
       
   493   <A HREF="http://www.youtube.com/watch?v=-03bouPsfEQ&feature=player_embedded">youtube</A> video).
       
   494   The other kind of project is a combination of hardware and software; usually attaching some sensors
       
   495   or motors to the Raspberry Pi or Arduino. This might require some soldering or what is called
       
   496   a <A HREF="http://en.wikipedia.org/wiki/Breadboard">bread-board</A>. But be careful before choosing a project
       
   497   involving new hardware: these devices
       
   498   can be destroyed (if &ldquo;Vin connected to GND&rdquo; or &ldquo;drawing more than 30mA from a GPIO&rdquo;
       
   499   does not make sense to you, you should probably stay away from such a project). 
       
   500   </p>
       
   501 
       
   502   <p>
       
   503   <center>
       
   504   <img style="-webkit-user-select: none; cursor: -webkit-zoom-in;
       
   505   "src="http://upload.wikimedia.org/wikipedia/commons/3/3d/RaspberryPi.jpg" width="313" height="209">
       
   506 
       
   507   <img style="-webkit-user-select: none; cursor: -webkit-zoom-in;
       
   508   "src="http://upload.wikimedia.org/wikipedia/commons/3/38/Arduino_Uno_-_R3.jpg" width="240" height="209">
       
   509   </center>
       
   510   </p>
       
   511 
       
   512   <p>
       
   513   <B>Skills:</B> 
       
   514   Well, you must be a hacker; happy to make things.
       
   515   </p>
       
   516 
       
   517 
       
   518 <li> <H4>[CU8] Proving Correctness of Programs</H4>
       
   519 
       
   520  <p>
       
   521  I am one of the main developers of the interactive theorem prover
       
   522  <A HREF="http://isabelle.in.tum.de">Isabelle</A>. This theorem prover
       
   523  has been used to establish the correctness of some quite large
       
   524  programs (for example an <A HREF="http://ertos.nicta.com.au/research/l4.verified/">operating system</A>).
       
   525  Together with colleagues from Nanjing, I used this theorem prover to establish the correctness of a
       
   526  scheduling algorithm, called
       
   527  <A HREF="http://en.wikipedia.org/wiki/Priority_inheritance">Priority Inheritance</A>,
       
   528  for real time operating systems. This scheduling algorithm is part of the operating
       
   529  system that drives, for example, the 
       
   530  <A HREF="http://en.wikipedia.org/wiki/Mars_Exploration_Rover">Mars rovers</A>.
       
   531  Actually, the very first Mars rover mission in 1997 did not have this
       
   532  algorithm switched on and it almost caused a catastrophic mission failure (see
       
   533  this youtube video <A HREF="http://www.youtube.com/watch?v=lyx7kARrGeM">here</A>
       
   534  for an explanation what happened).
       
   535  We were able to prove the correctness of this algorithm, but were also able to
       
   536  establish the correctness of some optimisations in this
       
   537  <A HREF="http://www.inf.kcl.ac.uk/staff/urbanc/Publications/pip.pdf">paper</A>.
       
   538  </p>
       
   539 
       
   540  <p>
       
   541  On a much smaller scale, there are a few small programs and underlying algorithms where it
       
   542  is not really understood whether they always compute a correct result (for example the
       
   543  regular expression matcher by Sulzmann and Lu in project [CU1]). 
       
   544  The aim of this
       
   545  project is to completely specify an algorithm in Isabelle and then prove it correct (that is,
       
   546  it always computes the correct result).
       
   547  </p>
       
   548 
       
   549   <p>
       
   550   <B>Skills:</B> 
       
   551   This project is for a very good student with a knack for theoretical things and formal reasoning.
       
   552   </p>
       
   553 
       
   554 
       
   555 <li> <H4>Earlier Projects</H4>
       
   556 
       
   557  I am also open to project suggestions from you. You might find some inspiration from my earlier projects:
       
   558  <A HREF="http://www.inf.kcl.ac.uk/staff/urbanc/bsc-projects-12.html">BSc 2012/13</A>, 
       
   559  <A HREF="http://www.inf.kcl.ac.uk/staff/urbanc/msc-projects-12.html">MSc 2012/13</A> 
       
   560 
       
   561 </ul>
       
   562 </TD>
       
   563 </TR>
       
   564 </TABLE>
       
   565 
       
   566 <P>
       
   567 <!-- hhmts start --> Last modified: Sun Nov 10 21:32:10 GMT 2013 <!-- hhmts end -->
       
   568 <a href="http://validator.w3.org/check/referer">[Validate this page.]</a>
       
   569 </BODY>
       
   570 </HTML>