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