diff --git a/bibliography.bib b/bibliography.bib index 905a994..8ddd134 100644 --- a/bibliography.bib +++ b/bibliography.bib @@ -242,3 +242,31 @@ isbn = {0201702452}, publisher = {Pearson Education}, } + + +@inproceedings{667766, + address = {London, UK}, + author = {Haakan Mattsson and Hans Nilsson and Claes Wikstrom}, + booktitle = {PADL '99: Proceedings of the First International Workshop on Practical Aspects of Declarative Languages}, + interhash = {3b61289b4cf321234fcef209681d70e6}, + intrahash = {f9f1e5b94bbcd945aa03459ad1698f61}, + pages = {152--163}, + publisher = {Springer-Verlag}, + title = {Mnesia - A Distributed Robust DBMS for Telecommunications Applications}, + url = {http://portal.acm.org/citation.cfm?id=645769.667766}, + year = 1998, + timestamp = {2007-12-06T05:02:39.000+0100}, + keywords = {database distributed erlang mnesia}, + added-at = {2007-12-06T05:02:39.000+0100}, + description = {Mnesia - A Distributed Robust DBMS for Telecommunications Applications}, + isbn = {3-540-65527-1}, + biburl = {http://www.bibsonomy.org/bibtex/2f9f1e5b94bbcd945aa03459ad1698f61/jhammerb} +} + +@MISC{webstorage:website, + AUTHOR = "Ian Hickson", + TITLE = "Web Storage -- Editor's Draft 27 April 2011", + MONTH = "May", + YEAR = {2011}, + URL = "http://dev.w3.org/html5/webstorage/" +} diff --git a/graphics/redundancy.dia b/graphics/redundancy.dia new file mode 100644 index 0000000..95e48d7 Binary files /dev/null and b/graphics/redundancy.dia differ diff --git a/graphics/redundancy.eps b/graphics/redundancy.eps new file mode 100644 index 0000000..fb5bde0 --- /dev/null +++ b/graphics/redundancy.eps @@ -0,0 +1,1468 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Title: /home/jonte/GGS/doc/report/graphics/redundancy.dia +%%Creator: Dia v0.97.1 +%%CreationDate: Thu May 5 11:51:37 2011 +%%For: jonte +%%Orientation: Portrait +%%Magnification: 1.0000 +%%BoundingBox: 0 0 984 272 +%%BeginSetup +%%EndSetup +%%EndComments +%%BeginProlog +[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright +/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one +/two /three /four /five /six /seven /eight /nine /colon /semicolon +/less /equal /greater /question /at /A /B /C /D /E +/F /G /H /I /J /K /L /M /N /O +/P /Q /R /S /T /U /V /W /X /Y +/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c +/d /e /f /g /h /i /j /k /l /m +/n /o /p /q /r /s /t /u /v /w +/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef +/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright +/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior +/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf +/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla +/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde +/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex +/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring +/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis +/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave +/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def +/cp {closepath} bind def +/c {curveto} bind def +/f {fill} bind def +/a {arc} bind def +/ef {eofill} bind def +/ex {exch} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth pop} bind def +/tr {translate} bind def + +/ellipsedict 8 dict def +ellipsedict /mtrx matrix put +/ellipse +{ ellipsedict begin + /endangle exch def + /startangle exch def + /yrad exch def + /xrad exch def + /y exch def + /x exch def /savematrix mtrx currentmatrix def + x y tr xrad yrad sc + 0 0 1 startangle endangle arc + savematrix setmatrix + end +} def + +/mergeprocs { +dup length +3 -1 roll +dup +length +dup +5 1 roll +3 -1 roll +add +array cvx +dup +3 -1 roll +0 exch +putinterval +dup +4 2 roll +putinterval +} bind def +/dpi_x 300 def +/dpi_y 300 def +/conicto { + /to_y exch def + /to_x exch def + /conic_cntrl_y exch def + /conic_cntrl_x exch def + currentpoint + /p0_y exch def + /p0_x exch def + /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def + /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def + /p2_x p1_x to_x p0_x sub 1 3 div mul add def + /p2_y p1_y to_y p0_y sub 1 3 div mul add def + p1_x p1_y p2_x p2_y to_x to_y curveto +} bind def +/start_ol { gsave 1.1 dpi_x div dup scale} bind def +/end_ol { closepath fill grestore } bind def +28.346000 -28.346000 scale +-0.700000 -17.687372 translate +%%EndProlog + + +1.000000 1.000000 1.000000 srgb +n 0.750000 12.591250 m 0.750000 17.091250 l 6.850000 17.091250 l 6.850000 12.591250 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 0.750000 12.591250 m 0.750000 17.091250 l 6.850000 17.091250 l 6.850000 12.591250 l cp s +gsave 2.748750 15.036250 translate 0.035278 -0.035278 scale +start_ol +2624 3392 moveto +2624 2944 lineto +2352 3073 2111 3136 conicto +1870 3200 1645 3200 conicto +1255 3200 1043 3052 conicto +832 2904 832 2631 conicto +832 2402 969 2285 conicto +1107 2169 1491 2097 conicto +1773 2039 lineto +2308 1937 2562 1678 conicto +2816 1420 2816 986 conicto +2816 469 2468 202 conicto +2121 -64 1450 -64 conicto +1197 -64 911 0 conicto +626 65 320 192 conicto +320 704 lineto +613 513 893 416 conicto +1174 320 1445 320 conicto +1857 320 2080 485 conicto +2304 650 2304 955 conicto +2304 1221 2148 1371 conicto +1992 1522 1636 1597 conicto +1352 1652 lineto +807 1756 563 1978 conicto +320 2201 320 2597 conicto +320 3056 654 3320 conicto +989 3584 1576 3584 conicto +1828 3584 2089 3536 conicto +2351 3488 2624 3392 conicto +end_ol grestore +gsave 3.155869 15.036250 translate 0.035278 -0.035278 scale +start_ol +2752 1480 moveto +2752 1280 lineto +704 1280 lineto +733 811 978 565 conicto +1223 320 1660 320 conicto +1914 320 2152 384 conicto +2390 448 2624 576 conicto +2624 192 lineto +2388 67 2140 1 conicto +1893 -64 1639 -64 conicto +1001 -64 628 309 conicto +256 683 256 1320 conicto +256 1979 613 2365 conicto +970 2752 1576 2752 conicto +2120 2752 2436 2410 conicto +2752 2068 2752 1480 conicto +2304 1600 moveto +2299 1950 2099 2159 conicto +1900 2368 1572 2368 conicto +1200 2368 976 2166 conicto +753 1964 719 1597 conicto +2304 1600 lineto +end_ol grestore +gsave 3.550495 15.036250 translate 0.035278 -0.035278 scale +start_ol +1984 2304 moveto +1912 2337 1828 2352 conicto +1744 2368 1642 2368 conicto +1282 2368 1089 2127 conicto +896 1887 896 1437 conicto +896 0 lineto +448 0 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1030 2531 1245 2641 conicto +1460 2752 1767 2752 conicto +1811 2752 1864 2752 conicto +1917 2752 1982 2752 conicto +1984 2304 lineto +end_ol grestore +gsave 3.812747 15.036250 translate 0.035278 -0.035278 scale +start_ol +128 2688 moveto +586 2688 lineto +1408 432 lineto +2230 2688 lineto +2688 2688 lineto +1702 0 lineto +1114 0 lineto +128 2688 lineto +end_ol grestore +gsave 4.192391 15.036250 translate 0.035278 -0.035278 scale +start_ol +2752 1480 moveto +2752 1280 lineto +704 1280 lineto +733 811 978 565 conicto +1223 320 1660 320 conicto +1914 320 2152 384 conicto +2390 448 2624 576 conicto +2624 192 lineto +2388 67 2140 1 conicto +1893 -64 1639 -64 conicto +1001 -64 628 309 conicto +256 683 256 1320 conicto +256 1979 613 2365 conicto +970 2752 1576 2752 conicto +2120 2752 2436 2410 conicto +2752 2068 2752 1480 conicto +2304 1600 moveto +2299 1950 2099 2159 conicto +1900 2368 1572 2368 conicto +1200 2368 976 2166 conicto +753 1964 719 1597 conicto +2304 1600 lineto +end_ol grestore +gsave 4.587017 15.036250 translate 0.035278 -0.035278 scale +start_ol +1984 2304 moveto +1912 2337 1828 2352 conicto +1744 2368 1642 2368 conicto +1282 2368 1089 2127 conicto +896 1887 896 1437 conicto +896 0 lineto +448 0 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1030 2531 1245 2641 conicto +1460 2752 1767 2752 conicto +1811 2752 1864 2752 conicto +1917 2752 1982 2752 conicto +1984 2304 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 10.355000 12.591250 m 10.355000 17.091250 l 16.455000 17.091250 l 16.455000 12.591250 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 10.355000 12.591250 m 10.355000 17.091250 l 16.455000 17.091250 l 16.455000 12.591250 l cp s +gsave 12.231250 15.036250 translate 0.035278 -0.035278 scale +start_ol +960 1728 moveto +960 384 lineto +1696 384 lineto +2071 384 2251 550 conicto +2432 716 2432 1057 conicto +2432 1401 2251 1564 conicto +2071 1728 1696 1728 conicto +960 1728 lineto +960 3136 moveto +960 2112 lineto +1639 2112 lineto +1975 2112 2139 2238 conicto +2304 2365 2304 2624 conicto +2304 2881 2139 3008 conicto +1975 3136 1639 3136 conicto +960 3136 lineto +448 3520 moveto +1673 3520 lineto +2222 3520 2519 3300 conicto +2816 3080 2816 2674 conicto +2816 2360 2658 2174 conicto +2500 1989 2193 1943 conicto +2549 1866 2746 1621 conicto +2944 1376 2944 1009 conicto +2944 526 2625 263 conicto +2306 0 1718 0 conicto +448 0 lineto +448 3520 lineto +end_ol grestore +gsave 12.670839 15.036250 translate 0.035278 -0.035278 scale +start_ol +1622 1344 moveto +1104 1344 904 1225 conicto +704 1106 704 818 conicto +704 589 854 454 conicto +1004 320 1262 320 conicto +1618 320 1833 572 conicto +2048 825 2048 1244 conicto +2048 1344 lineto +1622 1344 lineto +2496 1513 moveto +2496 0 lineto +2048 0 lineto +2048 384 lineto +1900 154 1679 45 conicto +1458 -64 1138 -64 conicto +733 -64 494 162 conicto +256 389 256 769 conicto +256 1213 555 1438 conicto +854 1664 1448 1664 conicto +2048 1664 lineto +2048 1712 lineto +2048 2025 1851 2196 conicto +1655 2368 1300 2368 conicto +1074 2368 860 2320 conicto +646 2272 448 2176 conicto +448 2560 lineto +687 2656 912 2704 conicto +1138 2752 1351 2752 conicto +1927 2752 2211 2444 conicto +2496 2137 2496 1513 conicto +end_ol grestore +gsave 13.062968 15.036250 translate 0.035278 -0.035278 scale +start_ol +2368 2560 moveto +2368 2176 lineto +2180 2272 1991 2320 conicto +1803 2368 1611 2368 conicto +1180 2368 942 2099 conicto +704 1830 704 1344 conicto +704 858 942 589 conicto +1180 320 1611 320 conicto +1803 320 1991 368 conicto +2180 416 2368 512 conicto +2368 128 lineto +2184 32 1987 -16 conicto +1791 -64 1569 -64 conicto +966 -64 611 316 conicto +256 697 256 1344 conicto +256 2000 615 2376 conicto +974 2752 1598 2752 conicto +1801 2752 1994 2704 conicto +2187 2656 2368 2560 conicto +end_ol grestore +gsave 13.415136 15.036250 translate 0.035278 -0.035278 scale +start_ol +448 3712 moveto +896 3712 lineto +896 1529 lineto +2196 2688 lineto +2752 2688 lineto +1346 1430 lineto +2816 0 lineto +2246 0 lineto +896 1313 lineto +896 0 lineto +448 0 lineto +448 3712 lineto +end_ol grestore +gsave 13.764808 15.036250 translate 0.035278 -0.035278 scale +start_ol +448 1040 moveto +448 2688 lineto +896 2688 lineto +896 1057 lineto +896 689 1042 504 conicto +1188 320 1481 320 conicto +1832 320 2036 541 conicto +2240 763 2240 1145 conicto +2240 2688 lineto +2688 2688 lineto +2688 0 lineto +2240 0 lineto +2240 384 lineto +2081 157 1870 46 conicto +1660 -64 1382 -64 conicto +923 -64 685 217 conicto +448 499 448 1040 conicto +1554 2752 moveto +1554 2752 lineto +end_ol grestore +gsave 14.169422 15.036250 translate 0.035278 -0.035278 scale +start_ol +896 384 moveto +896 -1024 lineto +448 -1024 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1032 2531 1240 2641 conicto +1448 2752 1737 2752 conicto +2217 2752 2516 2364 conicto +2816 1976 2816 1344 conicto +2816 712 2516 324 conicto +2217 -64 1737 -64 conicto +1448 -64 1240 46 conicto +1032 157 896 384 conicto +2368 1344 moveto +2368 1823 2171 2095 conicto +1975 2368 1632 2368 conicto +1289 2368 1092 2095 conicto +896 1823 896 1344 conicto +896 865 1092 592 conicto +1289 320 1632 320 conicto +1975 320 2171 592 conicto +2368 865 2368 1344 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 8.602500 13.667877 3.845873 3.845873 66.218638 117.108908 ellipse s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 9.924329 17.592574 m 10.255479 17.142197 l 9.696487 17.147503 l s +1.000000 1.000000 1.000000 srgb +n 19.655000 12.591250 m 19.655000 17.091250 l 25.755000 17.091250 l 25.755000 12.591250 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 19.655000 12.591250 m 19.655000 17.091250 l 25.755000 17.091250 l 25.755000 12.591250 l cp s +gsave 21.653750 15.036250 translate 0.035278 -0.035278 scale +start_ol +2624 3392 moveto +2624 2944 lineto +2352 3073 2111 3136 conicto +1870 3200 1645 3200 conicto +1255 3200 1043 3052 conicto +832 2904 832 2631 conicto +832 2402 969 2285 conicto +1107 2169 1491 2097 conicto +1773 2039 lineto +2308 1937 2562 1678 conicto +2816 1420 2816 986 conicto +2816 469 2468 202 conicto +2121 -64 1450 -64 conicto +1197 -64 911 0 conicto +626 65 320 192 conicto +320 704 lineto +613 513 893 416 conicto +1174 320 1445 320 conicto +1857 320 2080 485 conicto +2304 650 2304 955 conicto +2304 1221 2148 1371 conicto +1992 1522 1636 1597 conicto +1352 1652 lineto +807 1756 563 1978 conicto +320 2201 320 2597 conicto +320 3056 654 3320 conicto +989 3584 1576 3584 conicto +1828 3584 2089 3536 conicto +2351 3488 2624 3392 conicto +end_ol grestore +gsave 22.060869 15.036250 translate 0.035278 -0.035278 scale +start_ol +2752 1480 moveto +2752 1280 lineto +704 1280 lineto +733 811 978 565 conicto +1223 320 1660 320 conicto +1914 320 2152 384 conicto +2390 448 2624 576 conicto +2624 192 lineto +2388 67 2140 1 conicto +1893 -64 1639 -64 conicto +1001 -64 628 309 conicto +256 683 256 1320 conicto +256 1979 613 2365 conicto +970 2752 1576 2752 conicto +2120 2752 2436 2410 conicto +2752 2068 2752 1480 conicto +2304 1600 moveto +2299 1950 2099 2159 conicto +1900 2368 1572 2368 conicto +1200 2368 976 2166 conicto +753 1964 719 1597 conicto +2304 1600 lineto +end_ol grestore +gsave 22.455495 15.036250 translate 0.035278 -0.035278 scale +start_ol +1984 2304 moveto +1912 2337 1828 2352 conicto +1744 2368 1642 2368 conicto +1282 2368 1089 2127 conicto +896 1887 896 1437 conicto +896 0 lineto +448 0 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1030 2531 1245 2641 conicto +1460 2752 1767 2752 conicto +1811 2752 1864 2752 conicto +1917 2752 1982 2752 conicto +1984 2304 lineto +end_ol grestore +gsave 22.717747 15.036250 translate 0.035278 -0.035278 scale +start_ol +128 2688 moveto +586 2688 lineto +1408 432 lineto +2230 2688 lineto +2688 2688 lineto +1702 0 lineto +1114 0 lineto +128 2688 lineto +end_ol grestore +gsave 23.097391 15.036250 translate 0.035278 -0.035278 scale +start_ol +2752 1480 moveto +2752 1280 lineto +704 1280 lineto +733 811 978 565 conicto +1223 320 1660 320 conicto +1914 320 2152 384 conicto +2390 448 2624 576 conicto +2624 192 lineto +2388 67 2140 1 conicto +1893 -64 1639 -64 conicto +1001 -64 628 309 conicto +256 683 256 1320 conicto +256 1979 613 2365 conicto +970 2752 1576 2752 conicto +2120 2752 2436 2410 conicto +2752 2068 2752 1480 conicto +2304 1600 moveto +2299 1950 2099 2159 conicto +1900 2368 1572 2368 conicto +1200 2368 976 2166 conicto +753 1964 719 1597 conicto +2304 1600 lineto +end_ol grestore +gsave 23.492017 15.036250 translate 0.035278 -0.035278 scale +start_ol +1984 2304 moveto +1912 2337 1828 2352 conicto +1744 2368 1642 2368 conicto +1282 2368 1089 2127 conicto +896 1887 896 1437 conicto +896 0 lineto +448 0 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1030 2531 1245 2641 conicto +1460 2752 1767 2752 conicto +1811 2752 1864 2752 conicto +1917 2752 1982 2752 conicto +1984 2304 lineto +end_ol grestore +1.000000 1.000000 1.000000 srgb +n 29.260000 12.591250 m 29.260000 17.091250 l 35.360000 17.091250 l 35.360000 12.591250 l f +0.100000 slw +[] 0 sd +[] 0 sd +0 slj +0.000000 0.000000 0.000000 srgb +n 29.260000 12.591250 m 29.260000 17.091250 l 35.360000 17.091250 l 35.360000 12.591250 l cp s +gsave 31.136250 15.036250 translate 0.035278 -0.035278 scale +start_ol +960 1728 moveto +960 384 lineto +1696 384 lineto +2071 384 2251 550 conicto +2432 716 2432 1057 conicto +2432 1401 2251 1564 conicto +2071 1728 1696 1728 conicto +960 1728 lineto +960 3136 moveto +960 2112 lineto +1639 2112 lineto +1975 2112 2139 2238 conicto +2304 2365 2304 2624 conicto +2304 2881 2139 3008 conicto +1975 3136 1639 3136 conicto +960 3136 lineto +448 3520 moveto +1673 3520 lineto +2222 3520 2519 3300 conicto +2816 3080 2816 2674 conicto +2816 2360 2658 2174 conicto +2500 1989 2193 1943 conicto +2549 1866 2746 1621 conicto +2944 1376 2944 1009 conicto +2944 526 2625 263 conicto +2306 0 1718 0 conicto +448 0 lineto +448 3520 lineto +end_ol grestore +gsave 31.575839 15.036250 translate 0.035278 -0.035278 scale +start_ol +1622 1344 moveto +1104 1344 904 1225 conicto +704 1106 704 818 conicto +704 589 854 454 conicto +1004 320 1262 320 conicto +1618 320 1833 572 conicto +2048 825 2048 1244 conicto +2048 1344 lineto +1622 1344 lineto +2496 1513 moveto +2496 0 lineto +2048 0 lineto +2048 384 lineto +1900 154 1679 45 conicto +1458 -64 1138 -64 conicto +733 -64 494 162 conicto +256 389 256 769 conicto +256 1213 555 1438 conicto +854 1664 1448 1664 conicto +2048 1664 lineto +2048 1712 lineto +2048 2025 1851 2196 conicto +1655 2368 1300 2368 conicto +1074 2368 860 2320 conicto +646 2272 448 2176 conicto +448 2560 lineto +687 2656 912 2704 conicto +1138 2752 1351 2752 conicto +1927 2752 2211 2444 conicto +2496 2137 2496 1513 conicto +end_ol grestore +gsave 31.967968 15.036250 translate 0.035278 -0.035278 scale +start_ol +2368 2560 moveto +2368 2176 lineto +2180 2272 1991 2320 conicto +1803 2368 1611 2368 conicto +1180 2368 942 2099 conicto +704 1830 704 1344 conicto +704 858 942 589 conicto +1180 320 1611 320 conicto +1803 320 1991 368 conicto +2180 416 2368 512 conicto +2368 128 lineto +2184 32 1987 -16 conicto +1791 -64 1569 -64 conicto +966 -64 611 316 conicto +256 697 256 1344 conicto +256 2000 615 2376 conicto +974 2752 1598 2752 conicto +1801 2752 1994 2704 conicto +2187 2656 2368 2560 conicto +end_ol grestore +gsave 32.320136 15.036250 translate 0.035278 -0.035278 scale +start_ol +448 3712 moveto +896 3712 lineto +896 1529 lineto +2196 2688 lineto +2752 2688 lineto +1346 1430 lineto +2816 0 lineto +2246 0 lineto +896 1313 lineto +896 0 lineto +448 0 lineto +448 3712 lineto +end_ol grestore +gsave 32.669808 15.036250 translate 0.035278 -0.035278 scale +start_ol +448 1040 moveto +448 2688 lineto +896 2688 lineto +896 1057 lineto +896 689 1042 504 conicto +1188 320 1481 320 conicto +1832 320 2036 541 conicto +2240 763 2240 1145 conicto +2240 2688 lineto +2688 2688 lineto +2688 0 lineto +2240 0 lineto +2240 384 lineto +2081 157 1870 46 conicto +1660 -64 1382 -64 conicto +923 -64 685 217 conicto +448 499 448 1040 conicto +1554 2752 moveto +1554 2752 lineto +end_ol grestore +gsave 33.074422 15.036250 translate 0.035278 -0.035278 scale +start_ol +896 384 moveto +896 -1024 lineto +448 -1024 lineto +448 2688 lineto +896 2688 lineto +896 2304 lineto +1032 2531 1240 2641 conicto +1448 2752 1737 2752 conicto +2217 2752 2516 2364 conicto +2816 1976 2816 1344 conicto +2816 712 2516 324 conicto +2217 -64 1737 -64 conicto +1448 -64 1240 46 conicto +1032 157 896 384 conicto +2368 1344 moveto +2368 1823 2171 2095 conicto +1975 2368 1632 2368 conicto +1289 2368 1092 2095 conicto +896 1823 896 1344 conicto +896 865 1092 592 conicto +1289 320 1632 320 conicto +1975 320 2171 592 conicto +2368 865 2368 1344 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 27.507500 16.014623 3.845873 3.845873 246.218638 297.108908 ellipse s +0.100000 slw +[] 0 sd +0 slj +0 slc +n 26.185671 12.089926 m 25.854521 12.540303 l 26.413513 12.534997 l s +gsave 3.200000 9.150000 translate 0.035278 -0.035278 scale +start_ol +832 6208 moveto +1974 6208 lineto +4672 1015 lineto +4672 6208 lineto +5504 6208 lineto +5504 0 lineto +4362 0 lineto +1664 5193 lineto +1664 0 lineto +832 0 lineto +832 6208 lineto +end_ol grestore +gsave 4.044211 9.150000 translate 0.035278 -0.035278 scale +start_ol +2594 4160 moveto +1986 4160 1633 3672 conicto +1280 3185 1280 2336 conicto +1280 1487 1631 999 conicto +1982 512 2594 512 conicto +3198 512 3551 1002 conicto +3904 1492 3904 2336 conicto +3904 3176 3551 3668 conicto +3198 4160 2594 4160 conicto +2592 4800 moveto +3593 4800 4164 4146 conicto +4736 3493 4736 2336 conicto +4736 1184 4164 528 conicto +3593 -128 2592 -128 conicto +1587 -128 1017 528 conicto +448 1184 448 2336 conicto +448 3493 1017 4146 conicto +1587 4800 2592 4800 conicto +end_ol grestore +gsave 4.733566 9.150000 translate 0.035278 -0.035278 scale +start_ol +3520 3968 moveto +3389 4034 3235 4065 conicto +3082 4096 2897 4096 conicto +2239 4096 1887 3677 conicto +1536 3259 1536 2475 conicto +1536 0 lineto +768 0 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1780 4390 2172 4595 conicto +2564 4800 3124 4800 conicto +3204 4800 3301 4784 conicto +3398 4768 3516 4736 conicto +3520 3968 lineto +end_ol grestore +gsave 5.178149 9.150000 translate 0.035278 -0.035278 scale +start_ol +4415 3796 moveto +4701 4310 5099 4555 conicto +5498 4800 6037 4800 conicto +6764 4800 7158 4289 conicto +7552 3778 7552 2835 conicto +7552 0 lineto +6784 0 lineto +6784 2810 lineto +6784 3496 6547 3828 conicto +6311 4160 5826 4160 conicto +5233 4160 4888 3756 conicto +4544 3352 4544 2655 conicto +4544 0 lineto +3776 0 lineto +3776 2810 lineto +3776 3500 3539 3830 conicto +3303 4160 2809 4160 conicto +2225 4160 1880 3754 conicto +1536 3348 1536 2655 conicto +1536 0 lineto +768 0 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1797 4394 2162 4597 conicto +2527 4800 3029 4800 conicto +3536 4800 3890 4543 conicto +4245 4286 4415 3796 conicto +end_ol grestore +gsave 6.277121 9.150000 translate 0.035278 -0.035278 scale +start_ol +2834 2368 moveto +1921 2368 1568 2152 conicto +1216 1936 1216 1415 conicto +1216 999 1480 755 conicto +1744 512 2199 512 conicto +2826 512 3205 971 conicto +3584 1431 3584 2194 conicto +3584 2368 lineto +2834 2368 lineto +4352 2672 moveto +4352 0 lineto +3584 0 lineto +3584 704 lineto +3325 278 2938 75 conicto +2551 -128 1991 -128 conicto +1283 -128 865 275 conicto +448 678 448 1354 conicto +448 2143 970 2543 conicto +1492 2944 2527 2944 conicto +3584 2944 lineto +3584 3022 lineto +3584 3565 3238 3862 conicto +2892 4160 2267 4160 conicto +1870 4160 1493 4064 conicto +1116 3968 768 3776 conicto +768 4480 lineto +1187 4640 1581 4720 conicto +1975 4800 2348 4800 conicto +3356 4800 3854 4272 conicto +4352 3744 4352 2672 conicto +end_ol grestore +gsave 6.968973 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 6464 moveto +1536 6464 lineto +1536 0 lineto +768 0 lineto +768 6464 lineto +end_ol grestore +gsave 7.281181 9.150000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 7.640841 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 2536 moveto +4736 2176 lineto +1280 2176 lineto +1329 1363 1745 937 conicto +2162 512 2906 512 conicto +3337 512 3741 624 conicto +4146 736 4544 960 conicto +4544 256 lineto +4136 68 3708 -30 conicto +3280 -128 2840 -128 conicto +1736 -128 1092 525 conicto +448 1179 448 2294 conicto +448 3446 1061 4123 conicto +1675 4800 2716 4800 conicto +3650 4800 4193 4191 conicto +4736 3582 4736 2536 conicto +3968 2752 moveto +3960 3394 3625 3777 conicto +3290 4160 2738 4160 conicto +2112 4160 1736 3790 conicto +1361 3420 1304 2748 conicto +3968 2752 lineto +end_ol grestore +gsave 8.315206 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 4672 moveto +3021 2399 lineto +4800 0 lineto +3891 0 lineto +2526 1835 lineto +1163 0 lineto +256 0 lineto +2069 2444 lineto +384 4672 lineto +1303 4672 lineto +2560 3008 lineto +3817 4672 lineto +4736 4672 lineto +end_ol grestore +gsave 8.947114 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 2536 moveto +4736 2176 lineto +1280 2176 lineto +1329 1363 1745 937 conicto +2162 512 2906 512 conicto +3337 512 3741 624 conicto +4146 736 4544 960 conicto +4544 256 lineto +4136 68 3708 -30 conicto +3280 -128 2840 -128 conicto +1736 -128 1092 525 conicto +448 1179 448 2294 conicto +448 3446 1061 4123 conicto +1675 4800 2716 4800 conicto +3650 4800 4193 4191 conicto +4736 3582 4736 2536 conicto +3968 2752 moveto +3960 3394 3625 3777 conicto +3290 4160 2738 4160 conicto +2112 4160 1736 3790 conicto +1361 3420 1304 2748 conicto +3968 2752 lineto +end_ol grestore +gsave 9.641463 9.150000 translate 0.035278 -0.035278 scale +start_ol +4160 4480 moveto +4160 3776 lineto +3835 3968 3508 4064 conicto +3182 4160 2849 4160 conicto +2104 4160 1692 3681 conicto +1280 3202 1280 2336 conicto +1280 1470 1692 991 conicto +2104 512 2849 512 conicto +3182 512 3508 608 conicto +3835 704 4160 896 conicto +4160 192 lineto +3837 32 3491 -48 conicto +3146 -128 2756 -128 conicto +1697 -128 1072 538 conicto +448 1205 448 2336 conicto +448 3484 1078 4142 conicto +1709 4800 2807 4800 conicto +3163 4800 3502 4720 conicto +3842 4640 4160 4480 conicto +end_ol grestore +gsave 10.260878 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 1834 moveto +768 4672 lineto +1536 4672 lineto +1536 1863 lineto +1536 1188 1793 850 conicto +2051 512 2566 512 conicto +3185 512 3544 915 conicto +3904 1318 3904 2014 conicto +3904 4672 lineto +4672 4672 lineto +4672 0 lineto +3904 0 lineto +3904 704 lineto +3625 282 3257 77 conicto +2889 -128 2403 -128 conicto +1600 -128 1184 372 conicto +768 872 768 1834 conicto +2695 4800 moveto +2695 4800 lineto +end_ol grestore +gsave 10.975203 9.150000 translate 0.035278 -0.035278 scale +start_ol +1536 6016 moveto +1536 4672 lineto +3136 4672 lineto +3136 4096 lineto +1536 4096 lineto +1536 1543 lineto +1536 968 1694 804 conicto +1853 640 2338 640 conicto +3136 640 lineto +3136 0 lineto +2338 0 lineto +1446 0 1107 332 conicto +768 665 768 1543 conicto +768 4096 lineto +192 4096 lineto +192 4672 lineto +768 4672 lineto +768 6016 lineto +1536 6016 lineto +end_ol grestore +gsave 11.417289 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 4672 moveto +1536 4672 lineto +1536 0 lineto +768 0 lineto +768 4672 lineto +768 6464 moveto +1536 6464 lineto +1536 5504 lineto +768 5504 lineto +768 6464 lineto +end_ol grestore +gsave 11.729497 9.150000 translate 0.035278 -0.035278 scale +start_ol +2594 4160 moveto +1986 4160 1633 3672 conicto +1280 3185 1280 2336 conicto +1280 1487 1631 999 conicto +1982 512 2594 512 conicto +3198 512 3551 1002 conicto +3904 1492 3904 2336 conicto +3904 3176 3551 3668 conicto +3198 4160 2594 4160 conicto +2592 4800 moveto +3593 4800 4164 4146 conicto +4736 3493 4736 2336 conicto +4736 1184 4164 528 conicto +3593 -128 2592 -128 conicto +1587 -128 1017 528 conicto +448 1184 448 2336 conicto +448 3493 1017 4146 conicto +1587 4800 2592 4800 conicto +end_ol grestore +gsave 12.418852 9.150000 translate 0.035278 -0.035278 scale +start_ol +4672 2835 moveto +4672 0 lineto +3904 0 lineto +3904 2810 lineto +3904 3487 3646 3823 conicto +3388 4160 2872 4160 conicto +2252 4160 1894 3756 conicto +1536 3352 1536 2655 conicto +1536 0 lineto +768 0 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1811 4386 2183 4593 conicto +2556 4800 3044 4800 conicto +3847 4800 4259 4301 conicto +4672 3803 4672 2835 conicto +end_ol grestore +gsave 21.855000 9.150000 translate 0.035278 -0.035278 scale +start_ol +832 6208 moveto +4736 6208 lineto +4736 5504 lineto +1664 5504 lineto +1664 3648 lineto +4608 3648 lineto +4608 2944 lineto +1664 2944 lineto +1664 704 lineto +4800 704 lineto +4800 0 lineto +832 0 lineto +832 6208 lineto +end_ol grestore +gsave 22.566828 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 4672 moveto +3021 2399 lineto +4800 0 lineto +3891 0 lineto +2526 1835 lineto +1163 0 lineto +256 0 lineto +2069 2444 lineto +384 4672 lineto +1303 4672 lineto +2560 3008 lineto +3817 4672 lineto +4736 4672 lineto +end_ol grestore +gsave 23.213718 9.150000 translate 0.035278 -0.035278 scale +start_ol +4160 4480 moveto +4160 3776 lineto +3835 3968 3508 4064 conicto +3182 4160 2849 4160 conicto +2104 4160 1692 3681 conicto +1280 3202 1280 2336 conicto +1280 1470 1692 991 conicto +2104 512 2849 512 conicto +3182 512 3508 608 conicto +3835 704 4160 896 conicto +4160 192 lineto +3837 32 3491 -48 conicto +3146 -128 2756 -128 conicto +1697 -128 1072 538 conicto +448 1205 448 2336 conicto +448 3484 1078 4142 conicto +1709 4800 2807 4800 conicto +3163 4800 3502 4720 conicto +3842 4640 4160 4480 conicto +end_ol grestore +gsave 23.833132 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 2536 moveto +4736 2176 lineto +1280 2176 lineto +1329 1363 1745 937 conicto +2162 512 2906 512 conicto +3337 512 3741 624 conicto +4146 736 4544 960 conicto +4544 256 lineto +4136 68 3708 -30 conicto +3280 -128 2840 -128 conicto +1736 -128 1092 525 conicto +448 1179 448 2294 conicto +448 3446 1061 4123 conicto +1675 4800 2716 4800 conicto +3650 4800 4193 4191 conicto +4736 3582 4736 2536 conicto +3968 2752 moveto +3960 3394 3625 3777 conicto +3290 4160 2738 4160 conicto +2112 4160 1736 3790 conicto +1361 3420 1304 2748 conicto +3968 2752 lineto +end_ol grestore +gsave 24.527482 9.150000 translate 0.035278 -0.035278 scale +start_ol +1536 704 moveto +1536 -1792 lineto +768 -1792 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1777 4390 2144 4595 conicto +2512 4800 3022 4800 conicto +3869 4800 4398 4121 conicto +4928 3442 4928 2336 conicto +4928 1230 4398 551 conicto +3869 -128 3022 -128 conicto +2512 -128 2144 77 conicto +1777 282 1536 704 conicto +4096 2336 moveto +4096 3189 3754 3674 conicto +3413 4160 2816 4160 conicto +2219 4160 1877 3674 conicto +1536 3189 1536 2336 conicto +1536 1483 1877 997 conicto +2219 512 2816 512 conicto +3413 512 3754 997 conicto +4096 1483 4096 2336 conicto +end_ol grestore +gsave 25.244304 9.150000 translate 0.035278 -0.035278 scale +start_ol +1536 6016 moveto +1536 4672 lineto +3136 4672 lineto +3136 4096 lineto +1536 4096 lineto +1536 1543 lineto +1536 968 1694 804 conicto +1853 640 2338 640 conicto +3136 640 lineto +3136 0 lineto +2338 0 lineto +1446 0 1107 332 conicto +768 665 768 1543 conicto +768 4096 lineto +192 4096 lineto +192 4672 lineto +768 4672 lineto +768 6016 lineto +1536 6016 lineto +end_ol grestore +gsave 25.686390 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 4672 moveto +1536 4672 lineto +1536 0 lineto +768 0 lineto +768 4672 lineto +768 6464 moveto +1536 6464 lineto +1536 5504 lineto +768 5504 lineto +768 6464 lineto +end_ol grestore +gsave 25.998598 9.150000 translate 0.035278 -0.035278 scale +start_ol +2594 4160 moveto +1986 4160 1633 3672 conicto +1280 3185 1280 2336 conicto +1280 1487 1631 999 conicto +1982 512 2594 512 conicto +3198 512 3551 1002 conicto +3904 1492 3904 2336 conicto +3904 3176 3551 3668 conicto +3198 4160 2594 4160 conicto +2592 4800 moveto +3593 4800 4164 4146 conicto +4736 3493 4736 2336 conicto +4736 1184 4164 528 conicto +3593 -128 2592 -128 conicto +1587 -128 1017 528 conicto +448 1184 448 2336 conicto +448 3493 1017 4146 conicto +1587 4800 2592 4800 conicto +end_ol grestore +gsave 26.687954 9.150000 translate 0.035278 -0.035278 scale +start_ol +4672 2835 moveto +4672 0 lineto +3904 0 lineto +3904 2810 lineto +3904 3487 3646 3823 conicto +3388 4160 2872 4160 conicto +2252 4160 1894 3756 conicto +1536 3352 1536 2655 conicto +1536 0 lineto +768 0 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1811 4386 2183 4593 conicto +2556 4800 3044 4800 conicto +3847 4800 4259 4301 conicto +4672 3803 4672 2835 conicto +end_ol grestore +gsave 27.402279 9.150000 translate 0.035278 -0.035278 scale +start_ol +2834 2368 moveto +1921 2368 1568 2152 conicto +1216 1936 1216 1415 conicto +1216 999 1480 755 conicto +1744 512 2199 512 conicto +2826 512 3205 971 conicto +3584 1431 3584 2194 conicto +3584 2368 lineto +2834 2368 lineto +4352 2672 moveto +4352 0 lineto +3584 0 lineto +3584 704 lineto +3325 278 2938 75 conicto +2551 -128 1991 -128 conicto +1283 -128 865 275 conicto +448 678 448 1354 conicto +448 2143 970 2543 conicto +1492 2944 2527 2944 conicto +3584 2944 lineto +3584 3022 lineto +3584 3565 3238 3862 conicto +2892 4160 2267 4160 conicto +1870 4160 1493 4064 conicto +1116 3968 768 3776 conicto +768 4480 lineto +1187 4640 1581 4720 conicto +1975 4800 2348 4800 conicto +3356 4800 3854 4272 conicto +4352 3744 4352 2672 conicto +end_ol grestore +gsave 28.094131 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 6464 moveto +1536 6464 lineto +1536 0 lineto +768 0 lineto +768 6464 lineto +end_ol grestore +gsave 28.406340 9.150000 translate 0.035278 -0.035278 scale +start_ol +end_ol grestore +gsave 28.765999 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 2536 moveto +4736 2176 lineto +1280 2176 lineto +1329 1363 1745 937 conicto +2162 512 2906 512 conicto +3337 512 3741 624 conicto +4146 736 4544 960 conicto +4544 256 lineto +4136 68 3708 -30 conicto +3280 -128 2840 -128 conicto +1736 -128 1092 525 conicto +448 1179 448 2294 conicto +448 3446 1061 4123 conicto +1675 4800 2716 4800 conicto +3650 4800 4193 4191 conicto +4736 3582 4736 2536 conicto +3968 2752 moveto +3960 3394 3625 3777 conicto +3290 4160 2738 4160 conicto +2112 4160 1736 3790 conicto +1361 3420 1304 2748 conicto +3968 2752 lineto +end_ol grestore +gsave 29.440364 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 4672 moveto +3021 2399 lineto +4800 0 lineto +3891 0 lineto +2526 1835 lineto +1163 0 lineto +256 0 lineto +2069 2444 lineto +384 4672 lineto +1303 4672 lineto +2560 3008 lineto +3817 4672 lineto +4736 4672 lineto +end_ol grestore +gsave 30.072272 9.150000 translate 0.035278 -0.035278 scale +start_ol +4736 2536 moveto +4736 2176 lineto +1280 2176 lineto +1329 1363 1745 937 conicto +2162 512 2906 512 conicto +3337 512 3741 624 conicto +4146 736 4544 960 conicto +4544 256 lineto +4136 68 3708 -30 conicto +3280 -128 2840 -128 conicto +1736 -128 1092 525 conicto +448 1179 448 2294 conicto +448 3446 1061 4123 conicto +1675 4800 2716 4800 conicto +3650 4800 4193 4191 conicto +4736 3582 4736 2536 conicto +3968 2752 moveto +3960 3394 3625 3777 conicto +3290 4160 2738 4160 conicto +2112 4160 1736 3790 conicto +1361 3420 1304 2748 conicto +3968 2752 lineto +end_ol grestore +gsave 30.766621 9.150000 translate 0.035278 -0.035278 scale +start_ol +4160 4480 moveto +4160 3776 lineto +3835 3968 3508 4064 conicto +3182 4160 2849 4160 conicto +2104 4160 1692 3681 conicto +1280 3202 1280 2336 conicto +1280 1470 1692 991 conicto +2104 512 2849 512 conicto +3182 512 3508 608 conicto +3835 704 4160 896 conicto +4160 192 lineto +3837 32 3491 -48 conicto +3146 -128 2756 -128 conicto +1697 -128 1072 538 conicto +448 1205 448 2336 conicto +448 3484 1078 4142 conicto +1709 4800 2807 4800 conicto +3163 4800 3502 4720 conicto +3842 4640 4160 4480 conicto +end_ol grestore +gsave 31.386036 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 1834 moveto +768 4672 lineto +1536 4672 lineto +1536 1863 lineto +1536 1188 1793 850 conicto +2051 512 2566 512 conicto +3185 512 3544 915 conicto +3904 1318 3904 2014 conicto +3904 4672 lineto +4672 4672 lineto +4672 0 lineto +3904 0 lineto +3904 704 lineto +3625 282 3257 77 conicto +2889 -128 2403 -128 conicto +1600 -128 1184 372 conicto +768 872 768 1834 conicto +2695 4800 moveto +2695 4800 lineto +end_ol grestore +gsave 32.100361 9.150000 translate 0.035278 -0.035278 scale +start_ol +1536 6016 moveto +1536 4672 lineto +3136 4672 lineto +3136 4096 lineto +1536 4096 lineto +1536 1543 lineto +1536 968 1694 804 conicto +1853 640 2338 640 conicto +3136 640 lineto +3136 0 lineto +2338 0 lineto +1446 0 1107 332 conicto +768 665 768 1543 conicto +768 4096 lineto +192 4096 lineto +192 4672 lineto +768 4672 lineto +768 6016 lineto +1536 6016 lineto +end_ol grestore +gsave 32.542447 9.150000 translate 0.035278 -0.035278 scale +start_ol +768 4672 moveto +1536 4672 lineto +1536 0 lineto +768 0 lineto +768 4672 lineto +768 6464 moveto +1536 6464 lineto +1536 5504 lineto +768 5504 lineto +768 6464 lineto +end_ol grestore +gsave 32.854655 9.150000 translate 0.035278 -0.035278 scale +start_ol +2594 4160 moveto +1986 4160 1633 3672 conicto +1280 3185 1280 2336 conicto +1280 1487 1631 999 conicto +1982 512 2594 512 conicto +3198 512 3551 1002 conicto +3904 1492 3904 2336 conicto +3904 3176 3551 3668 conicto +3198 4160 2594 4160 conicto +2592 4800 moveto +3593 4800 4164 4146 conicto +4736 3493 4736 2336 conicto +4736 1184 4164 528 conicto +3593 -128 2592 -128 conicto +1587 -128 1017 528 conicto +448 1184 448 2336 conicto +448 3493 1017 4146 conicto +1587 4800 2592 4800 conicto +end_ol grestore +gsave 33.544011 9.150000 translate 0.035278 -0.035278 scale +start_ol +4672 2835 moveto +4672 0 lineto +3904 0 lineto +3904 2810 lineto +3904 3487 3646 3823 conicto +3388 4160 2872 4160 conicto +2252 4160 1894 3756 conicto +1536 3352 1536 2655 conicto +1536 0 lineto +768 0 lineto +768 4672 lineto +1536 4672 lineto +1536 3968 lineto +1811 4386 2183 4593 conicto +2556 4800 3044 4800 conicto +3847 4800 4259 4301 conicto +4672 3803 4672 2835 conicto +end_ol grestore +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 19.655000 17.091250 m 25.755000 12.591250 l s +0.100000 slw +[] 0 sd +[] 0 sd +0 slc +n 25.755000 17.091250 m 19.655000 12.591250 l s +showpage diff --git a/report.lyx b/report.lyx index 758551c..5a5e170 100644 --- a/report.lyx +++ b/report.lyx @@ -82,11 +82,31 @@ morestring=[b]" } +\lstdefinelanguage{Erlang}{ + keywords={typeof, true, false, catch, return, null, catch, switch, var, if, in, while, do, else, case, break, expose}, + keywordstyle=\color{blue}\bfseries, + ndkeywords={class, export, boolean, throw, implements, import, this,erlv8_vm, erlv8_fun_invocation +,erlv8_object}, + ndkeywordstyle=\color{darkgray}\bfseries, + identifierstyle=\color{black}, + sensitive=false, + comment=[l]{\%}, + morecomment=[s]{/*}{*/}, + commentstyle=\color{purple}\ttfamily, + stringstyle=\color{red}\ttfamily, + morestring=[b]', + morestring=[b]" +} + \usepackage{float} \floatstyle{ruled} \newfloat{code}{thp}{lop} \floatname{code}{Code} + +\usepackage{nomencl} +\makenomenclature +\renewcommand{\nomname}{Glossary} \end_preamble \use_default_options true \maintain_unincluded_children false @@ -349,6 +369,40 @@ Zork, or \emph on Pacman. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Zork}}{A textual computer game developed by students at MIT} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Pacman}}{An early graphical computer game developed by Namco} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{NetHack}}{An early computer game developed by the NetHack team, arguably + the oldest computer game still in development} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -406,8 +460,24 @@ Due to the increasing importance of computer gaming, more focus should be \end_layout \begin_layout Standard -The reliable generic game server, hereafter known as GGS, is a computer - program designed to +The reliable generic game server, hereafter known as GGS +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{GGS}}{Generic Game Server, a software for reliably hosting network + games. + The subject of this thesis.} +\end_layout + +\end_inset + +, is a computer program designed to \emph on host \emph default @@ -455,6 +525,82 @@ Counter-Strike The difference between the GGS and the servers for these games is that the servers for Doom, Quake, and the others listed, were designed with these specific games in mind. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Quake}}{A first person shooter series developed by ID software. + The series consists of four games.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Doom}}{A first person shooter series developed by ID software. + The series consists of three games.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{World of Warcraft}}{A MMORPG game developed by Blizzard. + The world's most popular MMORPG by subscriber count.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Counter-Strike}}{A multiplayer first person shooter game, popular + in E-Sports.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Framework}}{A supporting structure, the GGS is a framework for developing + network games} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{First-person shooter}}{A game in which centers around gun combat + from the first person perspective.} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{MMORPG}}{Massively multiplayer online role playing game. + An online game with several thousand participants.} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -487,6 +633,32 @@ reliable and software failures gracefully. In the event of a component breaking within the GGS, the error is handled by fault recovery processes, thereby creating a more reliable system. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Hardware failiure}}{A failiure in hardware (hard drive, memory, processor +, etc) which causes a system to stop functioning} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Software failiure}}{A failiure in software (the GGS, the operating + system, etc) which causes a system to stop functioning} +\end_layout + +\end_inset + + \end_layout \begin_layout Section @@ -525,6 +697,41 @@ Citation needed \end_layout \begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{The nine nines}}{A common goal for availability in the telecom business. + A system with nine nines of availability is available 99.999999999% of the + time} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Downtime}}{The amount of time a system is unavailable and does not + function} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Uptime}}{The amount of time a system is available and functions} +\end_layout + +\end_inset + A common figure often used in telecoms is that of \emph on the nine nines @@ -537,7 +744,17 @@ the nine nines \begin_inset Formula $15ms$ \end_inset - downtime in a year. + downtime in a year +\begin_inset Note Note +status open + +\begin_layout Plain Layout +Citation needed +\end_layout + +\end_inset + +. The level of instability and bad fault tolerance seen in the game server industry would not have been accepted in the telecoms industry. This level of instability should not be accepted in the game server industry @@ -711,6 +928,79 @@ TUXEDO \emph default application server, which can be used to run applications written in COBOL, C++ and other languages. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{SQL}}{Structured Query Language, a computer language common in querying + certain databases} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{JavaScript}}{A programming language originally developed by Netscape, + common in web programming} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{COBOL}}{Programming language} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{C++}}{Programming language} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Java}}{Programming language} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{AXD301}}{Telephone switch developed by Ericsson} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Erlang}}{A concurrent programming language, often used for telecom + applications. + The main language of the GGS} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -857,6 +1147,31 @@ game development language \emph default (hereafter GDL for brevity) is used. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{GDL}}{Game Development Language, the language used to program games + in the GGS} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{VM}}{Virtual Machine} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -930,7 +1245,8 @@ The implementation of the GGS protocol, together with storage possibilities, the project. To get a functional prototype some limits must be set on the types games that can be played on the prototype. -\end_layout +\begin_inset ERT +status open \begin_layout Standard The UDP protocol is not supported for communication between client and server. @@ -941,6 +1257,39 @@ The UDP protocol is not supported for communication between client and server. \begin_inset CommandInset ref LatexCommand vref reference "sec:Choice-of-network" +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{UDP}}{User Datagram Protocol, a connectionless networking protocol} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{TCP}}{Transmission Control Protocol, a streaming network protocol} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The UDP protocol is not supported for communication between client and server. + The TCP protocol was chosen in favour of UDP, due to the fact that the + implementation process using TCP was faster than if UDP would have been + used. + UDP is generally considered to be faster than TCP for the transfer of game + (and other) related data, this is discussed in more depth in +\begin_inset CommandInset ref +LatexCommand vref +reference "sec:Choice-of-network" \end_inset @@ -950,6 +1299,21 @@ reference "sec:Choice-of-network" Another limitation necessary to set on the system is the possibility to have huge game worlds due to the implementation of the scaling mechanism in the prototype. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Latency}}{A measure of delay, often measured in milliseconds} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -1020,15 +1384,26 @@ The implementation of the GGS described in this thesis is only a small prototype Method \end_layout -\begin_layout Subsection -Development process -\end_layout - \begin_layout Standard A prototype was developed early on in the project to carry out experiments. Using this prototype, the system was divided into modules. A demand specification was created, using this specification, the modules were easily identifiable. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Module}}{A part of a larger system} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -1041,6 +1416,7 @@ The first prototype of the GGS consisted of simple modules, however, due Once the basic structure of the GGS had been established, the first prototype was removed, remaining was the structure of the modules and the internal flow of the application. +<<<<<<< HEAD This could be seen as an iterative workflow, with the first prototype being the first iteration. The second iteration later became the result of the GGS @@ -1048,6 +1424,9 @@ Once the basic structure of the GGS had been established, the first prototype \begin_layout Subsection Design + This could be seen as an interative workflow, with the first prototype + being the first iteration. + The second iteration later became the final result of the GGS. \end_layout \begin_layout Standard @@ -1062,24 +1441,11 @@ The layout of the GGS is both layered and modular. \end_layout \begin_layout Standard -\begin_inset Note Note -status open - -\begin_layout Plain Layout -Perhaps a graphic of this modular layout..? -\end_layout - -\end_inset - - -\end_layout - -\begin_layout Subsection -Testing and evaluation -\end_layout - -\begin_layout Standard -Can we use quickcheck? +An informal specification and list of requirements of the system was outlined + early on in the project. + Usaility goals for developers were set. + During the project several demo applications were constructed, by constructing + these applications, the usability goals were enforced. \end_layout \begin_layout Chapter @@ -1928,6 +2294,22 @@ There are three main ways in which computer communication over the Internet Application layer protocols such as HTTP on the other hand needs a transport layer protocol to work. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{HTTP}}{Hyper Text Transport Protocol, a network protocol commonly + used to deliver web pages} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -2168,6 +2550,21 @@ messages \emph default instead of shared memory. We will discuss each of them later on. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Supervisor}}{A process monitoring and hadning crashes in other processes} +\end_layout + +\end_inset + + \end_layout \begin_layout Section @@ -2232,6 +2629,21 @@ The need for load balancing varies among different kind of systems. works on. A static structure where the number of servers are predefined or a dynamic structure where the number varies. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Amazon EC2}}{A cloud computation service} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -2313,6 +2725,21 @@ name "sub:UUID" \end_inset +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{UUID}}{Universally Unique Identifier} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -2520,6 +2947,32 @@ The obvious solution to this problem is to ensure mutual exclusion by using A different approach is to give each node the ability to generate Universally Unique Identifiers (UUID), where the state of one machine does not interfere with the state of another. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{MAC Address}}{Media Access Control address, used to identify network + cards} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{SHA-1}}{Cryptigraphic hash function, designed by the National Security + Agency (NSA)} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -2606,6 +3059,22 @@ reference "alg:A-simple-generator" , even when mutual system-wide exclusion is implemented. This is exactly the problem UUID:s solve. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Network split}}{Separation of two networks, occurs when two networks + can not communicate, commonly because of a hardware or software failiure} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -2709,6 +3178,23 @@ We only support languages running in a sandboxed environment. relational database. A game is not allowed to venture outside this namespace, and can because this not modify the persistent data of other games. + of this not modify the persistent data of other games. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Sandbox}}{A protected environment in which computer software can + be run safely} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -2822,6 +3308,66 @@ https://github.com/languages/ with the availability of several different JavaScript virtual machines was an important influence in choosing JavaScript as the main control language for our GGS prototype. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{CouchDB}}{Database server} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Riak}}{Database server} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{GitHub.com}}{Social coding website} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{ActionScript}}{Programming language} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Lua}}{Programming language} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{.NET}}{Software platform} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -2869,8 +3415,42 @@ Testing \end_layout \begin_layout Standard -NOTE: This is not a part of the final text. - There has been some work on the area of testing game servers, see +There are several ways in which the GGS can be tested. + The most important aspect has been deemed to be the experience players + have when using the GGS. + In order to test the user experience of the GGS, a realistic usage scenario + has to be set up. +\end_layout + +\begin_layout Standard +The GGS is intended to be used for powering games which have many concurrent + players. + The players need not participate in the same instance of the game, games + such as chess are prime candidates for the GGS. +\end_layout + +\begin_layout Standard +When developing the GGS, two main categories of games exhibiting different + performance demands were identified; real-time games and turn-based games. + The real-time games were deemed more demanding than the turn based games. + Tests were carried out using a real time game, since this is the more demanding + type of games. +\end_layout + +\begin_layout Standard +The real time game chosen for testing the GGS is +\emph on +Pong +\emph default +, a game in which two players play a game involving a all and two paddles. + The goal for each player is to shoot eside the othre player's paddle while + not allowing the ball to pass by her own paddle. + The game requires real time updates and is quite demanding when played + in several instances concurrently. +\end_layout + +\begin_layout Standard +There has been some work on the area of testing game servers, see \begin_inset CommandInset citation LatexCommand citet key "Lidholt02designand" @@ -2895,6 +3475,24 @@ number of clients able to connect to the server, and the system load. \end_layout +\begin_layout Standard +Similar tests were performed on the GGS, and the results of these tests + are visible in chapter +\begin_inset CommandInset ref +LatexCommand ref +reference "chap:Results-and-discussion" + +\end_inset + +. + The tests were initially performed by starting an operating system process + for each player. + Due to lack of hardware, not enough player processes could be started in + this way. + The bots were re-written in Erlang, and due to Erlang's light weigh threads, + enough processes could be created to successfully test the server. +\end_layout + \begin_layout Chapter Implementation of a prototype \begin_inset CommandInset label @@ -2979,6 +3577,32 @@ key "McKusick:2004:DIF:1014910" \end_inset . +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{LWP}}{Light Weight Process} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Context switch}}{The act of switching from one context, commonly + a process, to another. + Used by operating systems to achieve multi tasking} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -3151,6 +3775,22 @@ Erlang was designed by Ericsson, beginning in 1986, for the purpose of creating concurrent applications and improving telecom software. Features essential for the telecom instustry to achieve high availability in telecom switches were added to the language. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Mutex}}{A construct for achieving mutial exclusion, used to avoid + simultaneous access to shared resources in computer systems} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -3282,6 +3922,30 @@ reference "sec:Game-Development-Language" \end_inset . +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{OTP}}{Open Telecom Platform, a software suite for Erlang} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Behaviour}}{A design pattern in OTP} +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -3373,15 +4037,16 @@ application the GGS can be started in a way uniform to most erlang software, providing familiarity for other Erlang users, and eases the incorporation of the GGS in other applications. -\end_layout - -\begin_layout Standard -\begin_inset Note Note +\begin_inset ERT status open \begin_layout Plain Layout -Here we can have a more in-depth look at why Erlang was used, and outline - the characteristics of EWrlang that we make use of in the GGS. + + +\backslash +nomenclature{ +\backslash +textbf{Application}}{A way of packaging Erlang software in a uniform way} \end_layout \end_inset @@ -3389,6 +4054,217 @@ Here we can have a more in-depth look at why Erlang was used, and outline \end_layout +\begin_layout Subsection +Short introduction to the Erlang syntax +\end_layout + +\begin_layout Standard +In order to understand examples in this thesis, a small subset of Erlang + must be understood. + In this section, the very syntactic basics of Erlang are given. +\end_layout + +\begin_layout Itemize + +\series bold +Variables +\series default + start with an uppercase letter, examples include +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt X, Var}, and { +\backslash +tt Global} +\end_layout + +\end_inset + +. + A variable can only be assigned once. +\end_layout + +\begin_layout Itemize + +\series bold +Atoms +\emph on + +\series default +\emph default +start with lower case letters, for example: +\begin_inset ERT +status open + +\begin_layout Plain Layout + + { +\backslash +tt atom, a} +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +Functions +\series default + are defined starting with an atom for the name, parenthesis containing + parameters, an arrow, a function body and finally a dot marking the end + of a function. + +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt square(X) -> X*X.} +\end_layout + +\end_inset + + is an example of a function producing the square of X. +\end_layout + +\begin_layout Itemize +Functions are +\series bold +called +\series default + by suffixing an atom with the function name with parenthesis, for example + +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt square(10)} +\end_layout + +\end_inset + +. + Qualified names can be specified using ':', for example: +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt math:square(10)} +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +Tuples +\series default + are containers of fixed type for Erlang data types. + They are constructed using curly brackets, for example: +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt +\backslash +{atom1, atom2, atom3 +\backslash +}}. +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Itemize + +\series bold +Lists +\series default + are constructed using [ and ], for example: +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt [1,2,3]} +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +Strings +\series default + doubly qouted lists of characters, for example +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt "Hello world"} +\end_layout + +\end_inset + +. +\end_layout + +\begin_layout Itemize + +\series bold +Records +\series default + are erlang tuples coupled with a tag for each tuple element. + This allows refering to elements by name instead of by position. + An example of a record looks like this: +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt +\backslash +#myRecord{}} +\end_layout + +\end_inset + +. +\end_layout + \begin_layout Section Communication with external systems and applications \begin_inset CommandInset label @@ -3432,11 +4308,531 @@ localstorage by a call for the world object. Interaction with the players is done the same way using the player object instead. - The localstorage is a convenient way to store globals and other variables - seperated from the game state. + The localstorage is a convenient way to store globals and other data seperated + from the game state. + In section +\begin_inset CommandInset ref +LatexCommand ref +reference "sub:Exposing-Erlang-functionality" + +\end_inset + + a concrete example of the implementation of the localStorage and world + objects is given. +\begin_inset Note Note +status open + +\begin_layout Plain Layout Unique id:s called gametokens are generated for hosted games so that they are not mixed up. + -- good text, integrate more. +\end_layout + +\end_inset + + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{WebStorage}}{A new standard for letting websites store data on visitors' + computers} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Subsection +Exposing Erlang functionality to the GDL VM +\begin_inset CommandInset label +LatexCommand label +name "sub:Exposing-Erlang-functionality" + +\end_inset + + +\end_layout + +\begin_layout Standard +This section contains a concrete example of how the localStorage and world + objects are exposed to a GDL VM. + The example comes from the GGS prototype, which uses JavaScript powered + by Google V8 as its GDL VM. +\end_layout + +\begin_layout Standard +The code given in +\begin_inset CommandInset ref +LatexCommand ref +reference "alg:exposing-erlang" + +\end_inset + + is specific to V8 and JavaScript, however implementations for different + GDL:s, or different JavaScript VM:s should be similar. +\end_layout + +\begin_layout Standard +In JavaScript is is common to use a top level object, called a global object, + to establish a global scope. + This allows declaration of global variables and functions. + To gain access to the global object in the GGS, the +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt erlv8 +\backslash +_vm:global(..)} +\end_layout + +\end_inset + + function on line 2 of the example is used. + Using the global object, declarations of the world and GGS object can be + placed in the global scope. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt Global:set +\backslash +_value(..)} +\end_layout + +\end_inset + + is a call to the global object, declaring new objects in the global scope. + On line 4 the GGS object is declared. + By accessing +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt GGS.localStorage } +\end_layout + +\end_inset + + from within the GDL, access to the localstorage is provided, thus the localstor +age must be connected to the GGS object, this can be seen in line 5. +\end_layout + +\begin_layout Standard +Both the GGS and localStorage objects are dummy objects, which provide no + functionality, these two objects are simply placed in the GDL for the purpose + clearing up the code. + In order to perform an action using the GGS and localStorage objects, the +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt getItem} and { +\backslash +tt setItem} +\end_layout + +\end_inset + + functions must be used. + These items are directly connected to the database module of the GGS, which + is discussed in more detail in +\begin_inset CommandInset ref +LatexCommand ref +reference "sub:The-database-module" + +\end_inset + +. +\end_layout + +\begin_layout Standard +Similarly the functions +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt sendCommand, sendCommandToAll} and { +\backslash +tt setTimeout} +\end_layout + +\end_inset + + are directly connected to a piece of code in the GGS which performs the + desired action. + The +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt sendCommand} +\end_layout + +\end_inset + + functions are used to send commands or text to participants of the table. + The +\begin_inset ERT +status open + +\begin_layout Plain Layout + +{ +\backslash +tt setTimeout} +\end_layout + +\end_inset + + function introduces timeouts to the V8 engine, which are not available + per default. +\end_layout + +\begin_layout Standard +\begin_inset Float algorithm +wide false +sideways false +status open + +\begin_layout Plain Layout +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +lstset{ +\end_layout + +\begin_layout Plain Layout + +language=Erlang, +\end_layout + +\begin_layout Plain Layout + +backgroundcolor= +\backslash +color{white}, +\end_layout + +\begin_layout Plain Layout + +extendedchars=true, +\end_layout + +\begin_layout Plain Layout + +basicstyle= +\backslash +footnotesize +\backslash +ttfamily, +\end_layout + +\begin_layout Plain Layout + +showstringspaces=false, +\end_layout + +\begin_layout Plain Layout + +showspaces=false, +\end_layout + +\begin_layout Plain Layout + +numbers=left, +\end_layout + +\begin_layout Plain Layout + +numberstyle= +\backslash +footnotesize, +\end_layout + +\begin_layout Plain Layout + +numbersep=9pt, +\end_layout + +\begin_layout Plain Layout + +tabsize=2, +\end_layout + +\begin_layout Plain Layout + +breaklines=true, +\end_layout + +\begin_layout Plain Layout + +showtabs=false, +\end_layout + +\begin_layout Plain Layout + +captionpos=b +\end_layout + +\begin_layout Plain Layout + +} +\end_layout + +\begin_layout Plain Layout + + +\backslash +begin{lstlisting}[language=Erlang] +\end_layout + +\begin_layout Plain Layout + +% @doc Exposes some GGS functions to JavaScript +\end_layout + +\begin_layout Plain Layout + +expose(GameVM, Table) -> +\end_layout + +\begin_layout Plain Layout + + Global = erlv8_vm:global(GameVM), +\end_layout + +\begin_layout Plain Layout + + Global:set_value("GGS", erlv8_object:new([ +\end_layout + +\begin_layout Plain Layout + + {"localStorage", erlv8_object:new([ +\end_layout + +\begin_layout Plain Layout + + {"setItem", fun(#erlv8_fun_invocation{}, [Key, Val])-> +\end_layout + +\begin_layout Plain Layout + + ggs_db:setItem(Table, local_storage, Key, Val) +\end_layout + +\begin_layout Plain Layout + + end}, +\end_layout + +\begin_layout Plain Layout + + {"getItem", fun(#erlv8_fun_invocation{}, [Key])-> +\end_layout + +\begin_layout Plain Layout + + ggs_db:getItem(Table, local_storage, Key) +\end_layout + +\begin_layout Plain Layout + + end} +\end_layout + +\begin_layout Plain Layout + + % more functions ... +\end_layout + +\begin_layout Plain Layout + + ])}, +\end_layout + +\begin_layout Plain Layout + + {"world", erlv8_object:new([ +\end_layout + +\begin_layout Plain Layout + + {"setItem", fun(#erlv8_fun_invocation{}, [Key, Val])-> +\end_layout + +\begin_layout Plain Layout + + ggs_db:setItem(Table, world, Key, Val), +\end_layout + +\begin_layout Plain Layout + + ggs_table:send_command_to_all( +\end_layout + +\begin_layout Plain Layout + + Table, {"world_set", Key ++ "=" ++ Val} +\end_layout + +\begin_layout Plain Layout + + ) +\end_layout + +\begin_layout Plain Layout + + end}, +\end_layout + +\begin_layout Plain Layout + + {"getItem", fun(#erlv8_fun_invocation{}, [Key])-> +\end_layout + +\begin_layout Plain Layout + + ggs_db:getItem(Table, world, Key), +\end_layout + +\begin_layout Plain Layout + + end} +\end_layout + +\begin_layout Plain Layout + + % more functions ... +\end_layout + +\begin_layout Plain Layout + + ])}, +\end_layout + +\begin_layout Plain Layout + + {"sendCommand", fun(#erlv8_fun_invocation{}, [Player, Command, Args])-> +\end_layout + +\begin_layout Plain Layout + + ggs_table:send_command(Table, Player, {Command, Args}) +\end_layout + +\begin_layout Plain Layout + + end}, +\end_layout + +\begin_layout Plain Layout + + {"sendCommandToAll", fun(#erlv8_fun_invocation{}, [Command, Args])-> +\end_layout + +\begin_layout Plain Layout + + ggs_table:send_command_to_all(Table, {Command, Args}) +\end_layout + +\begin_layout Plain Layout + + end} +\end_layout + +\begin_layout Plain Layout + + {"setTimeout", fund(#erlv8_fun_invocation{}, [Time, Function])-> +\end_layout + +\begin_layout Plain Layout + + timer:apply_after(Time, ?MODULE, call_js, [GameVM, Function]) +\end_layout + +\begin_layout Plain Layout + + end} +\end_layout + +\begin_layout Plain Layout + + % more functions ... +\end_layout + +\begin_layout Plain Layout + + ])). +\end_layout + +\begin_layout Plain Layout + + +\backslash +end{lstlisting} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Plain Layout +\begin_inset Caption + +\begin_layout Plain Layout +\begin_inset CommandInset label +LatexCommand label +name "alg:exposing-erlang" + +\end_inset + +An example of how Erlang functionality is exposed to a Javascript GDL +\end_layout + +\end_inset + + +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -3552,6 +4948,31 @@ Am I right here? \end_inset +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{SRP}}{Single Responsibility Principle} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Object Oriented Programming}}{A programming paradigm focusing on + objects} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -4129,7 +5550,7 @@ After a crash in a table process, the entire table must be rebuilt and the Data kept in the actual game is not automatically corrupted by the crash in a table, however the table must be re-associated with the game VM is was associated with prior to the crash of the table. - The table process maps well into the setting of the real-world chess clib + The table process maps well into the setting of the real-world chess club scenario previously discussed. A table works in the same way in a real world setting as in the GGS setting. \end_layout @@ -4139,7 +5560,7 @@ The game virtual machine module \end_layout \begin_layout Standard -This module holds the game logic of a game and is responsible for the vm +This module holds the game logic of a game and is responsible for the VM associated with each game. \end_layout @@ -4167,7 +5588,7 @@ The VM itself makes it possible for the game developer to program in the doesn't need to take this into consideration when programming a game. If a method within the game sends data to a player, it will be delivered to the player in the correct running game. - The same game token is used to store the game state in the db. + The same game token is used to store the game state in the database. Therefore, no game states will be mixed up either. \end_layout @@ -4188,18 +5609,81 @@ name "sub:The-database-module" \end_layout \begin_layout Standard -Game data from all games on the GGS are stored here. - The database module is using a database management system called Mnesia. - Game data will not be lost when a game is stopped or has went down for - unknown reasons. - This makes it possible to continue a game just before the failure without - having to start the game from the beginning. - +Game data from all games on the GGS are stored in the database backend of + the database module. \end_layout \begin_layout Standard -Each game is uniquely identified by a table token and it's data is stored - within two different namespaces. +In the GGS prototype the database module is using a database management + system called Mnesia. + Mnesia ships with the standard Erlang distribution and is a key-value store + type database. + Mnesia is designed to handle the stress of telecoms systems, and has some + features specifically tailored for telecoms which are not commonly found + in other databases. + Key features of the Mnesia database are: +\end_layout + +\begin_layout Itemize +Fast key/value lookups +\end_layout + +\begin_layout Itemize +Distribution of the database system +\end_layout + +\begin_layout Itemize +Fault tolerance +\end_layout + +\begin_layout Standard +\begin_inset CommandInset citation +LatexCommand citet +key "667766" + +\end_inset + + +\end_layout + +\begin_layout Standard +The features of Mnesia originally intended for telecoms prove very useful + for the purposes of the GGS as well. + The fault tolerance and speed of Mnesia are very valueable tools, the fast + key/value lookups permit many lookups per second to the database. +\end_layout + +\begin_layout Standard +Game data will not be lost when a game is stopped or has gone down for unknown + reasons. + This makes it possible to continue a game just before the failure without + having to start the game from the beginning. + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Mnesia}}{Database server used in the GGS} +\end_layout + +\end_inset + + +\end_layout + +\begin_layout Standard +The GGS stores the game state in the distributed Mnesia database, from which + the state can be restored in the event of a crash. +\end_layout + +\begin_layout Standard +Each game is uniquely identified by a table token and the data of each game + is stored within two different namespaces. The namespaces are named World and Localstorage. The World is used contain all game data related to the game state. This sort of game data may change during the runtime of the game. @@ -4214,10 +5698,21 @@ Each game is uniquely identified by a table token and it's data is stored \end_layout \begin_layout Standard -The interface of the database module has been inspired by the W3C Web Storage - interface. - Only difference is the usage of the game token and namespace within the - database module of GGS. +The interface of the database module is an implementation of the upcoming + W3C Web Storage specification. + Web Storage is intended for use in web browsers, providing a persistant + storage on the local machine for web applications. + The storage can be used to communicate in between browser windows (which + is difficult when using cookies), and to store larger chunks of data +\begin_inset CommandInset citation +LatexCommand citet +key "webstorage:website" + +\end_inset + +. + Usage of the web storage standard in the GGS provides a well documented + interface to the database backend. \end_layout \begin_layout Section @@ -4253,6 +5748,32 @@ key "ieee_90" . There are some tools for creating reliable applications built in to Erlang. +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{Reliability}}{The ability of a system or component to perform its + required functions under stated conditions for a specified period of time} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{IEEE}}{Institute of Electrical and Electronics Engineers, read "I-triple- +E"} +\end_layout + +\end_inset + + \end_layout \begin_layout Itemize @@ -4487,7 +6008,11 @@ To prevent any data loss, the good state of the worker processes is stored \end_layout \begin_layout Subsection -Distribution +Reduncancy +\end_layout + +\begin_layout Standard + \end_layout \begin_layout Subsection @@ -4908,34 +6433,125 @@ name "cha:Problems-of-implementation" \end_layout +\begin_layout Standard +This chapter contains specific problems encountered when implementing the + GGS prototype. + Some of the problems described have solutions attached, however some problems + were not solved, therefore only ideas for slutions have been attached. +\end_layout + +\begin_layout Standard +The integration of JavaScript as a GDL in the GGS prototype was particularily + difficult, and is handled in this section. + Unique identification is also handled, as is the design of the GGS protocol. +\end_layout + \begin_layout Section +JavaScript engine +\end_layout + +\begin_layout Standard +The GGS prototype uses a vistual machine to sandbox each game. + JavaScript was chosen for the prototype due to its commonality in web applicati +ons and the flexibility of the language. + Any language with the proper bindings to Erlang could have been used in + theory. +\end_layout + +\begin_layout Standard +There are two main JavaScript virtual machines, or +\emph on +engines +\emph default + available at the time of the writing of this thesis. + There is a group of machines developed by Mozilla called +\emph on +TraceMonkey, JaegerMonkey, SpiderMonkey +\emph default +and +\emph on +IonMonkey +\emph default +, and also there is Google V8. + The group of Mozilla machines are largely the same, and are referred to + as the same machine for simplicity. +\end_layout + +\begin_layout Standard +For the Mozilla machines, there exists an Erlang binding called erlang_js, + and for the V8 machine a binding called erlv8 exists. +\end_layout + +\begin_layout Subsection erlang_js \end_layout \begin_layout Standard -To be able to run JavaScript on our server we needed to embed a JavaScript - engine within the server. - After a thorough investigation erlang_js became our choice. - Erlang_js provides direct communication with a JavaScript VM (Virtual Machine). - This was exactly what we wanted, but we also needed the possibility to - communicate from erlang_js to Erlang. - This functionality was not yet implemented in erlang_js, due to lack of - time. +Erlang_js provides direct communication with the JavaScript VM. + Which is exactly what is desired, however also required is thee possibility + to communicate from erlang_js to Erlang. + The ability to communicate from JavaScript to Erlang functionality is not + yet implemented in erlang_js, due to lack of time on the behalf of the + erlang_js developers. \end_layout \begin_layout Standard -There were two possible solutions to the problem. - We could rewrite some part of erlang_js, or we could switch erlang_js for - some other JavaScript engine. - Searching for other engines we found erlv8 and beam.js which provided the - functionality that we wanted. - As we tested beam.js it occurred random crashes of the whole Erlang environment. - These crashes were related to the use of erlv8 in beam.js and we decided - that the use of erlv8 was not an alternative due to the stability issues. +There were two possible solutions to the problem of the JavaScript to Erlang + communication path missing, the path could be implemented by the GGS project, + or a switch from erlang_js for some other JavaScript engine could be made. + \end_layout \begin_layout Standard -To get the functionality needed we decided to implement this in erlang_js. +Attempts at creating the communication path from JavaScript to Erlang were + initially made, however the communiucation path never became stable enough + for usage in the GGS and the erlang_js software was abandoned. +\end_layout + +\begin_layout Subsection +erlv8 +\end_layout + +\begin_layout Standard +erlv8 is powered by the V8 engine developed by Google rather than the engines + developed by Mozilla. + The ability to communicate with Erlang from JavaScript using callbacks + is available in the erlv8 bindings, therefore this feature does not have + to be added to the bindings in order to be used in the GGS. +\end_layout + +\begin_layout Standard +Initial releases of the erlv8 bindings had stability issues, these were + however solved by the erlv8 developers during the usage of erlv8 in the + GGS. + erlv8 is the JavaScript engine powering JavaScript as a GDL in the GGS. +\end_layout + +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{V8}}{JavaScript engine developed by Google} +\end_layout + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{SpiderMonkey}}{JavaScript engine developed by Mozilla} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -4962,8 +6578,40 @@ This problem is not new, and a common solution is to use a Universally Unique e generator. \end_layout +\begin_layout Subsection +Protocol design +\end_layout + +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +Discuss how the early GGS protocol were going to use both UDP and binary + plists to be as fast as possible. + Then discuss how complex these solutions were going to be to implement + in the prototype. + Mention that the modular structure of the GGS allows these features to + be implemented later on, but are not currently implemented. +\end_layout + +\end_inset + + +\end_layout + \begin_layout Section Design choices +\begin_inset Note Note +status open + +\begin_layout Plain Layout +This section is wrongly placed +\end_layout + +\end_inset + + \end_layout \begin_layout Standard @@ -5060,12 +6708,47 @@ Coordinator Understanding OTP \end_layout +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +This section should possibly be removed. + Writing how using OTP posed problems for us learning-wise does not seem + relevant. +\end_layout + +\end_inset + + +\end_layout + \begin_layout Section Usability \end_layout +\begin_layout Standard +\begin_inset Note Note +status open + +\begin_layout Plain Layout +Discuss how the GGS can be difficult to use for people not versed with Erlang +\end_layout + +\end_inset + + +\end_layout + \begin_layout Chapter Results and discussion +\begin_inset CommandInset label +LatexCommand label +name "chap:Results-and-discussion" + +\end_inset + + \end_layout \begin_layout Section @@ -5222,6 +6905,22 @@ Currently Mnesia is used for game data storage. system or use Mnesia in combination with the ETS module of erlang. ETS provides fast access to the RAM and thus Mnesia could be used less frequently. + +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +nomenclature{ +\backslash +textbf{ETS}}{Erlang Term Storage} +\end_layout + +\end_inset + + \end_layout \begin_layout Subsection @@ -5288,12 +6987,27 @@ To start the GGS is not self explanatory. Conclusion \end_layout -\begin_layout Chapter* -Glossary +\begin_layout Standard +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +addcontentsline{toc}{section}{Glossary} \end_layout -\begin_layout Standard -Here we could add some important words and their definitions.. +\begin_layout Plain Layout + + +\backslash +printnomenclature +\end_layout + +\end_inset + + \end_layout \begin_layout Standard diff --git a/report.pdf b/report.pdf index 1c4c91a..98db35f 100644 Binary files a/report.pdf and b/report.pdf differ