msc-projects-12.html
changeset 154 a73de9a29bb5
child 155 c33e45869209
equal deleted inserted replaced
153:7acf8ff8cb0d 154:a73de9a29bb5
       
     1 <?xml version="1.0" encoding="utf-8"?>
       
     2 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
       
     3 <HEAD>
       
     4 <TITLE>2012/13 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 </HEAD>
       
     9 <BODY TEXT="#000000" 
       
    10       BGCOLOR="#4169E1" 
       
    11       LINK="#0000EF" 
       
    12       VLINK="#51188E" 
       
    13       ALINK="#FF0000"
       
    14       ONLOAD="striper('ul','striped','li','first,second')">
       
    15 
       
    16 
       
    17 
       
    18 <TABLE WIDTH="100%" 
       
    19        BGCOLOR="#4169E1" 
       
    20        BORDER="0"   
       
    21        FRAME="border"  
       
    22        CELLPADDING="10"     
       
    23        CELLSPACING="2"
       
    24        RULES="all">
       
    25 
       
    26 <TR>
       
    27 <TD BGCOLOR="#FFFFFF" 
       
    28     WIDTH="75%" 
       
    29     VALIGN="TOP">
       
    30 
       
    31 <H2>2012/13 MSc Projects</H2>
       
    32 <H4>Supervisor: Christian Urban</H4> 
       
    33 <H4>Email: christian dot urban at kcl dot ac dot uk,  Office: Strand Building S1.27</H4>
       
    34 <H4>If you are interested in a project, please send me an email and we can discuss details. Please include
       
    35 a short description about your programming skills and Computer Science background in your first email. 
       
    36 I will also need your King's username in order to book the project for you. Thanks.</H4> 
       
    37 
       
    38 <H4>Note that besides being a lecturer at the theoretical end of Computer Science, I am also a passionate
       
    39     <A HREF="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacker</A> &hellip;
       
    40     defined as &ldquo;a person who enjoys exploring the details of programmable systems and 
       
    41     stretching their capabilities, as opposed to most users, who prefer to learn only the minimum 
       
    42     necessary.&rdquo; I am always happy to supervise like-minded students.</H4>  
       
    43 
       
    44 <ul class="striped">
       
    45 <li> <H4>[CU1] Regular Expression Matching and Partial Derivatives</H4>
       
    46 
       
    47   <p>
       
    48   <B>Description:</b>  
       
    49   <A HREF="http://en.wikipedia.org/wiki/Regular_expression">Regular expressions</A> 
       
    50   are extremely useful for many text-processing tasks...finding patterns in texts,
       
    51   lexing programs, syntax highlighting and so on. Given that regular expressions were
       
    52   introduced in 1950 by <A HREF="http://en.wikipedia.org/wiki/Stephen_Cole_Kleene">Stephen Kleene</A>, you might think 
       
    53   regular expressions have since been studied to death. But you would definitely be mistaken: in fact they are still
       
    54   an active research area. For example
       
    55   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">this paper</A> 
       
    56   about regular expression matching and partial derivatives was presented this summer at the international 
       
    57   PPDP'12 conference.</p>
       
    58 
       
    59   <p>The background for this project is that some regular expressions are 
       
    60   &quot;<A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">evil</A>&quot; 
       
    61   and can &quot;stab you in the back&quot; according to
       
    62   this recent <A HREF="http://tech.blog.cueup.com/regular-expressions-will-stab-you-in-the-back">blog post</A>.
       
    63   For example, if you use in <A HREF="http://www.python.org">Python</A> or 
       
    64   in <A HREF="http://www.ruby-lang.org/en/">Ruby</A> (probably also in other mainstream programming languages) the 
       
    65   innocently looking regular expression <code>a?{28}a{28}</code> and match it, say, against the string 
       
    66   <code>aaaaaaaaaaaaaaaaaaaaaaaaaaaa</code>, you will soon notice that your CPU usage goes to 100%. In fact,
       
    67   Python and Ruby need approximately 30 seconds for matching this string. You can try it for yourself:
       
    68   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/re.py">re.py</A> (Python version) and 
       
    69   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/re-internal.rb">re.rb</A> 
       
    70   (Ruby version). You can imagine an attacker
       
    71   mounting a nice <A HREF="http://en.wikipedia.org/wiki/Denial-of-service_attack">DoS attack</A> against 
       
    72   your program if it contains such an &quot;evil&quot; regular expression. Actually 
       
    73   <A HREF="http://www.scala-lang.org/">Scala</A> (and also Java) are almost immune from such
       
    74   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
       
    75   the regular expression and string further to, say, 4,600 <code>a</code>s, you get a <code>StackOverflowError</code> 
       
    76   exception chrashing your program.
       
    77   </p>
       
    78 
       
    79   <p>
       
    80   On a rainy afternoon, I implemented 
       
    81   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/cgi-bin/repos.cgi/afl-material/raw-file/tip/re3.scala">this</A> 
       
    82   regular expression matcher in Scala. It is not as fast as the official one in Scala, but
       
    83   it can match up to 11,000 <code>a</code>s in less than 5 seconds  without raising any exception
       
    84   (remember Python and Ruby both need nearly 30 seconds to process 28(!) <code>a</code>s, and Scala's
       
    85   offical matcher maxes out at 4,600 <code>a</code>s). My matcher is approximately
       
    86   85 lines of code and based on the concept of 
       
    87   <A HREF="http://lambda-the-ultimate.org/node/2293">derivatives of regular experssions</A>.
       
    88  Derivatives were introduced in 1964 by <A HREF="http://en.wikipedia.org/wiki/Janusz_Brzozowski_(computer_scientist)">
       
    89   Janusz Brzozowski</A>, but according to this 
       
    90   <A HREF="http://www.cl.cam.ac.uk/~so294/documents/jfp09.pdf">paper</A> had been lost in the &quot;sands of time&quot;.
       
    91   The advantage of derivatives is that they side-step completely the usual 
       
    92   <A HREF="http://hackingoff.com/compilers/regular-expression-to-nfa-dfa">translations</A> of regular expressions
       
    93   into NFAs or DFAs, which can introduce the exponential behaviour exhibited by the regular
       
    94   expression matchers in Python and Ruby.
       
    95   </p>
       
    96 
       
    97   <p>
       
    98   Now the guys from the 
       
    99   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">PPDP'12-paper</A> mentioned 
       
   100   above claim they are even faster than me and can deal with even more features of regular expressions
       
   101   (for example subexpression matching, which my rainy-afternoon matcher lacks). I am sure they thought
       
   102   about the problem much longer than a single afternoon. The task 
       
   103   in this project is to find out how good they actually are by implementing the results from their paper. 
       
   104   Their approach is based on the concept of partial derivatives introduced in 1994 by
       
   105   <A HREF="http://reference.kfupm.edu.sa/content/p/a/partial_derivatives_of_regular_expressio_1319383.pdf">Valentin Antimirov</A>.
       
   106   I used them <A HREF="http://www.inf.kcl.ac.uk/staff/urbanc/Publications/rexp.pdf">once</A> 
       
   107   in order to prove the <A HREF="http://en.wikipedia.org/wiki/Myhill–Nerode_theorem">Myhill-Nerode theorem</A>
       
   108   by using only regular expressions.
       
   109   </p>
       
   110 
       
   111   <p>
       
   112   <B>Literature:</B> 
       
   113   The place to start with this project is obviously this
       
   114   <A HREF="http://www.home.hs-karlsruhe.de/~suma0002/publications/ppdp12-part-deriv-sub-match.pdf">paper</A>.
       
   115   Traditional methods for regular expression matching are explained
       
   116   in the wikipedia articles 
       
   117   <A HREF="http://en.wikipedia.org/wiki/DFA_minimization">here</A> and 
       
   118   <A HREF="http://en.wikipedia.org/wiki/Powerset_construction">here</A>.
       
   119   The authoritative <A HREF="http://infolab.stanford.edu/~ullman/ialc.html">book</A>
       
   120   on automata and regular expressions is by John Hopcroft and Jeffrey Ullmann (available in the library). 
       
   121   There is also an online course about this topic by Ullman at 
       
   122   <A HREF="https://www.coursera.org/course/automata">Coursera</A>, though IMHO not 
       
   123   done with love. 
       
   124   Finally, there are millions of other pointers about regular expression
       
   125   matching on the Net. Test cases for &quot;<A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">evil</A>&quot;
       
   126   regular expressions can be obtained from <A HREF="http://en.wikipedia.org/wiki/ReDoS#Examples">here</A>.
       
   127   </p>
       
   128 
       
   129   <p>
       
   130   <B>Skills:</B> 
       
   131   This is a project for a student with an interest in theory and some
       
   132   reasonable programming skills. The project can be easily implemented
       
   133   in languages like
       
   134   <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   135   <A HREF="http://en.wikipedia.org/wiki/Standard_ML">ML</A>,  
       
   136   <A HREF="http://haskell.org/haskellwiki/Haskell">Haskell</A>, 
       
   137   <A HREF="http://www.python.org">Python</A>, etc.
       
   138   </p>
       
   139 
       
   140 <!--
       
   141 <li> <H4>[CU2] Equivalence Checking of Regular Expressions</H4>
       
   142 
       
   143   <p>
       
   144   <B>Description:</b>  
       
   145   Solving the problem of deciding the equivalence of regular expressions can be used
       
   146   to decide a number of problems in automated reasoning. Recently, 
       
   147   <A HREF="http://www.cs.unibo.it/~asperti/">Andreas Asperti</A>
       
   148   proposed a simple method for deciding regular expression equivalence described
       
   149   <A HREF="http://www.cs.unibo.it/~asperti/PAPERS/compact.pdf">here</A>. 
       
   150   The task is to implement this method and test it on examples.
       
   151   It would be also interesting to see whether Asperti's method applies to
       
   152   extended regular expressions, described
       
   153   <A HREF="http://ww2.cs.mu.oz.au/~sulzmann/manuscript/reg-exp-partial-derivatives.pdf">here</A>.
       
   154   </p>
       
   155 
       
   156   <p>
       
   157   <B>Literature:</B> 
       
   158   The central literature is obviously the papers
       
   159   <A HREF="http://www.cs.unibo.it/~asperti/PAPERS/compact.pdf">here</A> and
       
   160   <A HREF="http://ww2.cs.mu.oz.au/~sulzmann/manuscript/reg-exp-partial-derivatives.pdf">here</A>.
       
   161   Asperti has also some slides <A HREF="http://www.cs.unibo.it/~asperti/SLIDES/regular.pdf">here</a>.
       
   162   More references about regular expressions can be found
       
   163   <A HREF="http://en.wikipedia.org/wiki/Regular_expression">here</A>. Like in
       
   164   [CU1], I will give a lot of the background pf this project in
       
   165   my Automata and Formal Languages course (6CCS3AFL).
       
   166   </p>  
       
   167 
       
   168   <p>
       
   169   <B>Skills:</B> 
       
   170   This is a project for a student with a passion for theory and some
       
   171   reasonable programming skills. The project can be easily implemented
       
   172   in languages like Scala
       
   173   <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   174   <A HREF="http://en.wikipedia.org/wiki/Standard_ML">ML</A>,  
       
   175   <A HREF="http://haskell.org/haskellwiki/Haskell">Haskell</A>, 
       
   176   <A HREF="http://www.python.org">Python</A>, etc.
       
   177   Being able to read <A HREF="http://haskell.org/haskellwiki/Haskell">Haskell</A>
       
   178   code is beneficial for the part involving extended regular expressions.
       
   179   </p>
       
   180 -->
       
   181 
       
   182 <li> <H4>[CU3] Machine Code Generation for a Simple Compiler</H4>
       
   183 
       
   184   <p>
       
   185   <b>Description:</b> 
       
   186   Compilers translate high-level programs that humans can read and write into
       
   187   efficient machine code that can be run on a CPU or virtual machine.
       
   188   I recently implemented a very simple compiler for a very simple functional
       
   189   programming language following this 
       
   190   <A HREF="http://www.cs.princeton.edu/~dpw/papers/tal-toplas.pdf">paper</A> 
       
   191   (also described <A HREF="http://www.cs.princeton.edu/~dpw/papers/tal-tr.pdf">here</A>).
       
   192   My code, written in <A HREF="http://www.scala-lang.org/">Scala</A>, of this compiler is 
       
   193   <A HREF="http://www.dcs.kcl.ac.uk/staff/urbanc/compiler.scala">here</A>.
       
   194   The compiler can deal with simple programs involving natural numbers, such
       
   195   as Fibonacci numbers
       
   196   or factorial (but it can be easily extended - that is not the point).
       
   197   </p>
       
   198 
       
   199   <p>
       
   200   While the hard work has been done (understanding the two papers above),
       
   201   my compiler only produces some idealised machine code. For example I
       
   202   assume there are infinitely many registers. The goal of this
       
   203   project is to generate machine code that is more realistic and can
       
   204   run on a CPU, like x86, or run on a virtual machine, say the JVM. 
       
   205   This gives probably a speedup of thousand times in comparison to
       
   206   my naive machine code and virtual machine. The project
       
   207   requires to dig into the literature about real CPUs and generating 
       
   208   real machine code. 
       
   209   </p>
       
   210 
       
   211   <p>
       
   212   <B>Literature:</B>
       
   213   There is a lot of literature about compilers 
       
   214   (for example <A HREF="http://www.cs.princeton.edu/~appel/papers/cwc.html">this book</A> -
       
   215   I can lend you my copy for the duration of the project). A very good overview article
       
   216   about implementing compilers by 
       
   217   <A HREF="http://tratt.net/laurie/">Laurie Tratt</A> is 
       
   218   <A HREF="http://tratt.net/laurie/tech_articles/articles/how_difficult_is_it_to_write_a_compiler">here</A>.
       
   219   An introduction into x86 machine code is <A HREF="http://ianseyler.github.com/easy_x86-64/">here</A>.
       
   220   Intel's official manual for the x86 instruction is 
       
   221   <A HREF="http://download.intel.com/design/intarch/manuals/24319101.pdf">here</A>. 
       
   222   A simple assembler for the JVM is described <A HREF="http://jasmin.sourceforge.net">here</A>.
       
   223   An interesting twist of this project is to not generate code for a CPU, but
       
   224   for the intermediate language of the <A HREF="http://llvm.org">LLVM</A> compiler
       
   225   (also described <A HREF="https://wiki.aalto.fi/display/t1065450/LLVM+IR">here</A> and
       
   226   <A HREF="http://llvm.org/docs/LangRef.html">here</A>). If you want to see
       
   227   what machine code looks like you can compile your C-program using gcc -S.
       
   228   </p>
       
   229 
       
   230   <p>
       
   231   <B>Skills:</B> 
       
   232   This is a project for a student with a deep interest in programming languages and
       
   233   compilers. Since my compiler is implemented in <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   234   it would make sense to continue this project in this language. I can be
       
   235   of help with questions and books about <A HREF="http://www.scala-lang.org/">Scala</A>.
       
   236   But if Scala is a problem, my code can also be translated quickly into any other functional
       
   237   language. 
       
   238   </p>
       
   239 
       
   240 <li> <H4>[CU4] Implementation of Register Spilling Algorithms</H4>
       
   241   
       
   242   <p>
       
   243   <b>Description:</b> 
       
   244   This project is similar to [CU3]. The emphasis here, however, is on the
       
   245   implementation and comparison of register spilling algorithms, also often called register allocation 
       
   246   algorithms. They are part of any respectable compiler.  As said
       
   247   in [CU3], however, my simple compiler lacks them and assumes an infinite amount of registers instead.
       
   248   Real CPUs however only provide a fixed amount of registers (for example
       
   249   x86-64 has 16 general purpose registers). Whenever a program needs
       
   250   to hold more values than registers, the values need to be &ldquo;spilled&rdquo;
       
   251   into the main memory. Register spilling algorithms try to minimise
       
   252   this spilling, since fetching values from main memory is a costly 
       
   253   operation. 
       
   254   </p>
       
   255 
       
   256   <p>
       
   257   The classic algorithm for register spilling uses a
       
   258   <A HREF="http://en.wikipedia.org/wiki/Register_allocation">graph-colouring method</A>.
       
   259   However, for some time the <A HREF="http://llvm.org">LLVM</A> compiler
       
   260   used a supposedly more efficient method, called the linear scan allocation method
       
   261   (described 
       
   262   <A HREF="http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf">here</A>).
       
   263   However, it was later decided to abandon this method in favour of 
       
   264   a <A HREF="http://blog.llvm.org/2011/09/greedy-register-allocation-in-llvm-30.html">
       
   265   greedy register allocation</A> method. It would be nice if this project can find out
       
   266   what the issues are with these methods and implement at least one of them for the 
       
   267   simple compiler referenced in [CU3].
       
   268   </p>
       
   269 
       
   270   <p>
       
   271   <B>Literature:</B> 
       
   272   The graph colouring method is described in Andrew Appel's 
       
   273   <A HREF="http://www.cs.princeton.edu/~appel/modern/java/">book</A> on compilers
       
   274   (I can give you my copy of this book, if it is not available in the library).
       
   275   There is also a survey 
       
   276   <A HREF="http://compilers.cs.ucla.edu/fernando/publications/drafts/survey.pdf">article</A> 
       
   277   about register allocation algorithms with further pointers.
       
   278   </p>
       
   279 
       
   280   <p>
       
   281   <B>Skills:</B> 
       
   282   Same skills as [CU3].
       
   283   </p>
       
   284 
       
   285 <li> <H4>[CU5] A Student Polling System</H4>
       
   286 
       
   287   <p>
       
   288   <B>Description:</B>
       
   289   One of the more annoying aspects of giving a lecture is to ask a question
       
   290   to the students and no matter how easy the questions is to not 
       
   291   receive an answer. Recently, the online course system 
       
   292   <A HREF="http://www.udacity.com">Udacity</A> made an art out of
       
   293   asking questions during lectures (see for example the
       
   294   <A HREF="http://www.udacity.com/overview/Course/cs253/CourseRev/apr2012">Web Application Engineering</A> 
       
   295   course CS253).
       
   296   The lecturer there gives multiple-choice questions as part of the lecture and the students need to 
       
   297   click on the appropriate answer. This works very well in the online world. 
       
   298   For  &ldquo;real-world&rdquo; lectures, the department has some 
       
   299   <A HREF="http://en.wikipedia.org/wiki/Audience_response">clickers</A>
       
   300   (these are little devices part of an audience response systems). However, 
       
   301   they are a logistic nightmare for the lecturer: they need to be distributed 
       
   302   during the lecture and collected at the end. Nowadays, where students
       
   303   come with their own laptop or smartphone to lectures, this can
       
   304   be improved.
       
   305   </p>
       
   306 
       
   307   <p>
       
   308   The task of this project is to implement an online student
       
   309   polling system. The lecturer should be able to prepare 
       
   310   questions beforehand (encoded as some web-form) and be able to 
       
   311   show them during the lecture. The students
       
   312   can give their answers by clicking on the corresponding webpage.
       
   313   The lecturer can then collect the responses online and evaluate them 
       
   314   immediately. Such a system is sometimes called
       
   315   <A HREF="http://en.wikipedia.org/wiki/Audience_response#Smartphone_.2F_HTTP_voting">HTML voting</A>. 
       
   316   There are a number of commercial
       
   317   solutions for this problem, but they are not easy to use (in addition
       
   318   to being ridiculously expensive). A good student can easily improve upon
       
   319   what they provide. 
       
   320   </p>
       
   321 
       
   322   <p>
       
   323   The problem of student polling is not as hard as 
       
   324   <A HREF="http://en.wikipedia.org/wiki/Electronic_voting">electronic voting</A>, 
       
   325   which essentially is still an unsolved problem in Computer Science. The
       
   326   students only need to be prevented from answering question more than once thus skewing
       
   327   any statistics. Unlike electronic voting, no audit trail needs to be kept
       
   328   for student polling. Restricting the number of answers can probably be solved 
       
   329   by setting appropriate cookies on the students
       
   330   computers or smart phones.
       
   331   </p>
       
   332 
       
   333   <p>
       
   334   <B>Literature:</B> 
       
   335   The project requires fluency in a web-programming language (for example 
       
   336   <A HREF="http://en.wikipedia.org/wiki/JavaScript">Javascript</A>,
       
   337   <A HREF="http://en.wikipedia.org/wiki/PHP">PHP</A>, 
       
   338   Java, <A HREF="http://www.python.org">Python</A>, 
       
   339   <A HREF="http://en.wikipedia.org/wiki/Go_(programming_language)">Go</A>, 
       
   340   <A HREF="http://www.scala-lang.org/">Scala</A>,
       
   341   <A HREF="http://en.wikipedia.org/wiki/Ruby_(programming_language)">Ruby</A>) 
       
   342   and possibly a cloud application platform (for example
       
   343   <A HREF="https://developers.google.com/appengine/">Google App Engine</a> or 
       
   344   <A HREF="http://www.heroku.com">Heroku</A>).
       
   345   For web-programming the 
       
   346   <A HREF="http://www.udacity.com/overview/Course/cs253/CourseRev/apr2012">Web Application Engineering</A>
       
   347   course at <A HREF="http://www.udacity.com">Udacity</A> is a good starting point 
       
   348   to be aware of the issues involved. This course uses <A HREF="http://www.python.org">Python</A>.
       
   349   To evaluate the answers from the student, Google's 
       
   350   <A HREF="https://developers.google.com/chart/image/docs/making_charts">Chart Tools</A>
       
   351   might be useful, which ar also described in this 
       
   352   <A HREF="http://www.youtube.com/watch?v=NZtgT4jgnE8">youtube</A> video.
       
   353   </p>
       
   354 
       
   355   <p>
       
   356   <B>Skills:</B> 
       
   357   In order to provide convenience for the lecturer, this project needs very good web-programming skills. A 
       
   358   <A HREF="http://en.wikipedia.org/wiki/Hacker_(programmer_subculture)">hacker mentality</A>
       
   359   (see above) is probably very beneficial: web-programming is an area that only emerged recently and
       
   360   many tools still lack maturity. You probably have to experiment a lot with several different
       
   361   languages and tools.
       
   362   </p>
       
   363 
       
   364 <li> <H4>[CU6] Implementation of a Distributed Clock-Synchronisation Algorithm developed at NASA</H4>
       
   365   
       
   366   <p>
       
   367   <B>Description:</B>
       
   368   There are many algorithms for synchronising clocks. This
       
   369   <A HREF="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20120000054_2011025573.pdf">paper</A> 
       
   370   describes a new algorithm for clocks that communicate by exchanging
       
   371   messages and thereby reach a state in which (within some bound) all clocks are synchronised.
       
   372   A slightly longer and more detailed paper about the algorithm is 
       
   373   <A HREF="http://hdl.handle.net/2060/20110020812">here</A>.
       
   374   The point of this project is to implement this algorithm and simulate networks of clocks.
       
   375   </p>
       
   376 
       
   377   <p>
       
   378   <B>Literature:</B> 
       
   379   There is a wide range of literature on clock syncronisation algorithms. 
       
   380   Some pointers are given in this
       
   381   <A HREF="http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20120000054_2011025573.pdf">paper</A>,
       
   382   which describes the algorithm to be implemented in this project. Pointers
       
   383   are given also <A HREF="http://en.wikipedia.org/wiki/Clock_synchronization">here</A>.
       
   384   </p>
       
   385 
       
   386   <p>
       
   387   <B>Skills:</B> 
       
   388   In order to implement a simulation of a network of clocks, you need to tackle
       
   389   concurrency. You can do this for example in the programming language
       
   390   <A HREF="http://www.scala-lang.org/">Scala</A> with the help of the 
       
   391   <A HREF="http://akka.io">Akka</a> library. This library enables you to send messages
       
   392   between different <I>actors</I>. <A HREF="http://www.scala-lang.org/node/242">Here</A> 
       
   393   are some examples that explain how to implement exchanging messages between actors. 
       
   394   </p>
       
   395 
       
   396 </ul>
       
   397 </TD>
       
   398 </TR>
       
   399 </TABLE>
       
   400 
       
   401 <P>
       
   402 <!-- Created: Tue Mar  4 00:23:25 GMT 1997 -->
       
   403 <!-- hhmts start -->
       
   404 Last modified: Wed Sep 12 16:30:03 GMT 2012
       
   405 <!-- hhmts end -->
       
   406 <a href="http://validator.w3.org/check/referer">[Validate this page.]</a>
       
   407 </BODY>
       
   408 </HTML>