From b4208667eabde68ba5ce10db864365c891dd53a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jonas=20Bone=CC=81r?=
Date: Wed, 6 Apr 2011 14:15:59 +0200
Subject: [PATCH] Added new module 'akka-docs' as the basis for the new
Sphinx/reST based docs. Also added the first draft of the new Getting Started
Guide
---
akka-docs/Makefile | 49 +++
akka-docs/_static/akka.png | Bin 0 -> 5959 bytes
akka-docs/_static/logo.png | Bin 0 -> 8112 bytes
akka-docs/conf.py | 65 ++++
akka-docs/index.rst | 14 +
akka-docs/manual/getting-started-first.rst | 347 +++++++++++++++++
akka-docs/manual/more.png | Bin 0 -> 1502 bytes
akka-docs/themes/akka/layout.html | 64 ++++
akka-docs/themes/akka/pygments/akka.py | 58 +++
akka-docs/themes/akka/static/akka.css_t | 352 ++++++++++++++++++
.../themes/akka/static/alert_info_32.png | Bin 0 -> 1168 bytes
.../themes/akka/static/alert_warning_32.png | Bin 0 -> 1060 bytes
akka-docs/themes/akka/static/bg-page.png | Bin 0 -> 164 bytes
.../themes/akka/static/bullet_orange.png | Bin 0 -> 365 bytes
akka-docs/themes/akka/theme.conf | 12 +
15 files changed, 961 insertions(+)
create mode 100644 akka-docs/Makefile
create mode 100644 akka-docs/_static/akka.png
create mode 100644 akka-docs/_static/logo.png
create mode 100644 akka-docs/conf.py
create mode 100644 akka-docs/index.rst
create mode 100755 akka-docs/manual/getting-started-first.rst
create mode 100644 akka-docs/manual/more.png
create mode 100644 akka-docs/themes/akka/layout.html
create mode 100644 akka-docs/themes/akka/pygments/akka.py
create mode 100644 akka-docs/themes/akka/static/akka.css_t
create mode 100644 akka-docs/themes/akka/static/alert_info_32.png
create mode 100644 akka-docs/themes/akka/static/alert_warning_32.png
create mode 100644 akka-docs/themes/akka/static/bg-page.png
create mode 100644 akka-docs/themes/akka/static/bullet_orange.png
create mode 100644 akka-docs/themes/akka/theme.conf
diff --git a/akka-docs/Makefile b/akka-docs/Makefile
new file mode 100644
index 0000000000..fedddbee17
--- /dev/null
+++ b/akka-docs/Makefile
@@ -0,0 +1,49 @@
+# Makefile for Sphinx documentation
+#
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = _build
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
+
+.PHONY: help clean html singlehtml latex pdf
+
+help:
+ @echo "Please use \`make ' where is one of"
+ @echo " html to make standalone HTML files"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " pdf to make LaTeX files and run them through pdflatex"
+
+clean:
+ -rm -rf $(BUILDDIR)/*
+
+html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+singlehtml:
+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
+ @echo
+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
+
+latex:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo
+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
+ "(use \`make latexpdf' here to do that automatically)."
+
+pdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ make -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
diff --git a/akka-docs/_static/akka.png b/akka-docs/_static/akka.png
new file mode 100644
index 0000000000000000000000000000000000000000..d79821a0470333b5a79225ddfde526d9e6ba8d8c
GIT binary patch
literal 5959
zcmeAS@N?(olHy`uVBq!ia0y~yU{qmXV3^Or#=yW3(7faw0|SF(iEBhjaDG}zd16s2
zgJVj5QmTSyZen_BP-@?GOZ4$dUmkjr*Ihf_pT-}nk+kC^8HJRF~~g(_`!iwAJ_l?bpE{ps{?yIyCB1~lP^~N|9t=d
zm*@39|6bSsf6pew=-}a?VN`YV|IhRPe*FG-qiG6*fRI2}&piRjzs+9^)t9bQU;4kX
zrNOd-QIJ7w&7xiQmpa!!{r~O#|BtelnEDLL;fo0x!4!EYDkdet+TgyjM{S9GnKqi`(vqtlO~C$t%BOg58=o`}R*TRX*_E
zR#Mq-Q%=^^q*wdvH-Ffrf3oS6gBL@LS$WEl8xC(;)--SX|K@SmyWhP|ZjbJjbKluo
zrYSkm=3VR4mILMtPDSo+Oq}JOBC3DROfBI3D15S4=1`u}v!y~oE35fkE-m%C$H2k4
z!P%|)Tgg(*c;*D&QRoH+HGKqg<}1urF~(9Z2fJLQ#L_UWij5aQr8C@4=c
zT2=M*mv3a|qs{fJG!*)$iztdrc(-$jbKJK47yqq~dhN1Gl6|Yo`qFrkxW`MM#s%B<
z1;tMcRS@P4f1<0KdH(NQ`9nez!{^KF&fu+{XMf}%^M~!sjM@95e#BYD$Hr=(IJB{_
z{?V=KUGuAZ%pyDv6pH7bpO>yN-TQ<`(cPBN4@W0wTe`SyRdC_*J8ihor>mTobys%u
zcaQ7qUdUzlm?-q4$j>uShG|}R#)?ZH23%4Z#g74Do?vCv#3<;x#FT62QP&s5gaYMwXgsEXe}Gw
zWDdkJwl;ujQ
z&)M&9`ndbq`;VflN=`Ukh={ayW8js(QMTzr-18l^yIGegtXX)dy;SAoe(=RV~sv}DisP}WIn
zc1SH@ak6qX+BL~zkuvKlwzNMtZypGG+2gqVcq7xP)jqd(o-&_cYS)(6Sh{4=+=7Kg
z=hvHs-*KG~)Y73BJbT&>SB38jry29!t8p;AoILH&iJgaHtL>XrE={brds8`E(oW_xb(eRd+Jm3<6X34=FdJyuY#Ll-fq`VIq0(OQ#-Zt)Qt@5KH6d2sPl;qQA?%b!hk*_QQFz%gRw(~y?!O?Ns9x|78wi5OpUH7m5=uKb>D
z35yd~lcCX!R7oBk<Hyl4L!fAgcwytF5udk+??2D{vnk5_FCf1KDpRbNRbdv@&9
zrawh%R$Z%|Hq%1wc+!DOteTAz_C&iU-&Wk!I_+Ryio^N9HnSARUyMdpTO^BSin|p=^tsp6+$t`QMSHu0XI>
zWYX-PeEFb+FW~iKqUXUof=0V8{&;z4)9Dwpd!(kHz8j>tOE=PW{Eg_J
z7SkoON}4CE(RdKi>U=ZSaP8AQSG-m+op{vsZu7$Zmc=3YvtqW$KUuW)lGZE*H9N6M
zjpe&oHRrPFg?qT@pHw>4UsIZYIQC&!Q2p7Y1c7jq3ELNPcD^foeamRE?@3YFo0?)b
zmRJ9~W8YoT7oxaSMz$zXQCD$s8k=P48J**)8EJR5r(JJn{JfuU>#iq3ol6dsdb)gh
zd1ZHPz^o(Dsfz@cwD9dzSaS2-<+5Yn*POpsv(&4owdLv3NpX_585a1w*;~+mT}Inz
zMovnQ5a)*L*|qW_9sduicNQz3KP|eqL%VE`%CUu;+qIWYY<|qlysgJG@}!h*N6F?H
zcP0G1{(e@Q^z^J}XL;bw6DOBx&y?9Qd!~o{=X2U8cYawO9nAAmLb5VjMniKoLwwwS
zk(r?(lemA~p6RpC`kRef#HSlF(kr(JG+6v>`R?WU{)T|(-uBba#D5;yZ+a$Q{Ib)m
zrE~Pw|K8TMMCJIIuZc7WVwfp;*=${rD+$HLvuV&bVD>7r69C{8L}=bIG?e
zkBiFh5>H%fdA5m9;c;8c`R@z2*Rd!qov%EZd;6qsLFIAt-#=BJn6z|4`qG-MOo~69
z#cug7KByQj*s<(|_}PEbO4p;yjxBhu&-TyLB=pDO@O?r@HNDO5q=dvec$P?qG)#CS
zFlp;7yW+c&-y-^}#DiI#qL}`lV^HMZdH?o>h@6$V*Sy;w`})*1_gcA^3BF14f5#(t
zMJ{vSj*{p5bd8cq?nbZ3{bC_--eX0AbC`&}$n^_1GG5-8?Kde%)%V!4b~iq`BD7m_p;iD#6YE3Vmlbn-I=RqgKi_s?jS
zE}9T%{rT3@j;A83O@fnz9K=@C=(-9^e!4oXWW#p6{r8
zqPb;NxL`J0xxjSam*(F-IMuRDntFD(Wz$}U*?sD=&fbq-lpU+6-cTiWO!KGdB*xP(
zb#+vVoqiZOxW!H4SDhTm)5oN$$*?r|gOE?yg(=@SPo-?xo-%Q{p_+G
zlz$(SpSMIj%7>>#_iRG^!fEOLUh%&_PLfmXz36v5NO5n?8Pk|e1&fxj_e6Sz8|ohW
z(WAIBHA8!Pip#T{g=h4tzgkR>y>cMu3G=islk3AzX0Qo%exCMhyJ$|F^@@y7llBM*
z?ezY1I!k=U@m+Zjr`ekI<~Z0L@X>xbZ_Sdj1|F`hGh4R&P42SLI(u}o<;JTkK24e<
zJSpU{>s;M;y7A9VC&rz&Q43=VoE)Sq=(~8?5{+JCcU_6QA!4f@tE^d|`N6g#l4r>i
zlNG+#x^5j_Q@GKz*~f(gks6Q{-szf9pi*)cgXX;!%V^ZXO9^4<1{t%*8#
zGQuMyY@y7@i;NFMJUXLg-n*;aGBgqr`_+5&_k(*!!mW;#c!y|f`0YG5RhYZ;(u>oA
zpG9vQH%w+_-OzrbBRc3#ZdK~!9yg9xua6vw3$T5+I(W+arBA1;erwBhPwNwMma-^R
zxn%Lo@wuK$DTkcO`>$(L&u14DFL@KrIkk!RdQ{i^2^uS6_&J^*3_YwRF3>1_{N(d8
z-S1AO2Q5GHtc{Yld%r(;9+zQc;mr)ywKEkK3z@bt9N^TvdpT^%lr^eb({`+Q`()3H
zJ6ar`w5NK4yDBJA$qdON=2%w;*se0w$LncEvCNPR1b+@JWX
zx|D%|;R{FSoh`a+6d4$rgoJe8b}xFSTGYkBz>%r=aZSh;P9_Eg8^wvPEUP&f8bTvH
z4sKX5qmrBZ+`2jE4G+&NDxVZA5q-(%pUmQ~tW)!dJe^RV-aWCiJ8<+m(@|H9&
zp7@XJFGrmF8`lGp8p-{4?Q4_H%LR+Rld-wYA8WKU@=fdVa)t81Sf$;OvPnz+_U_WK
zG2^w}_Bes#T-7hntNy{Vj|^RW->>CM6s+1hA!EWjrU?^xCfe;^{E1g};^m!3k7sS$
zW4LI=0tw&dLldvX6bF3#n0z`&DLZsck~*X7q>BfQcSvvQ$*+n1bLg^nz3((<;Tb(4
zDlQ(np%1Oa!{6RYxUhVA)SqmY-44%Jy>E`5ADUoP^=;kF^;%QvKVF@3$$jGgh1+gs
zA8t!)aprl*!}Peb^>gyXKq;@j6w#|~-yfV_ov~tF(8Ei!3nGJWPus9F^y;SNOGWsm
z{<@Le;6LG1*iRq#4|^i2y4)BKocXxut?7oRhBl(I)o%=MXwF}mGJC`FZns@xiC(`R
zwoHkM^5{Lt{difn?cwshb1QC2au&SgzJDQyA&6;Cs{zl66^jj=ZIf&IULLo;)PLtd
zRFRX{^gfnTgGR|738(Sm95~3<%ZJe#6zI%(C
zR&(*iU7QEv=SL)BJjHYHJ9Kz^OTr5Bx6YKK7`2n!pek?Y?N+Rz9oa+&XHz
zw);6Pn#vse`o!^L`}ZE)X&J(0AQN1%$@Gxlw!sYG1h9w7BS(J^po+&CREUrTpwU>$~nIWl_$28#a9?W=x&i
z%gdY-G3#Q2qk%-Sdc$ck>m;SSA}uLCB6gd9+%CSzFK}t*L4&+a{W*s>b_!kHH|49#
zsfQ68na;OO2=Kq%RVosFZP&Y^((Mx_JlHf>LeY|ciqh?0jJsxT&Gm8pr`hX#y(sdQ
z#@3@7K6`sCWBR_aX!3zr>y#_6qC9q=I1(t?^L6R8B;kPVeqQ!#1cZL>*!8UDeN#_q_g}5E|HAtv
zbz+ck-&G%rYu+~|J=lL)Fv_xgx!CU)?|-KhOB(@zzE1>BbM^s>F)?o+UBejo00w^dW7gD@SUKq~=G9Ft=-$<|hB$
zk=Ebsm_GaF+r?AO#7h{3qFgw<6=y${_6|#TtbOUUvq1Fn>DiNF|L9i76kch~=-IJ(
z?n=Kzu8kj>-m0F-)qZPkvcSQGd%?`-Mb;nriqa;OU;ck=+5Y9<8C@>kn$$Yw$M(xA
z>JJYYMlW$W{Z>IqzU2z{Z|=?e@7%i(zq9=3o8lcO_byT`o&TiF`}Fgv%dQ@gW~%!*
z@xZG9KK_*&DH~s_F-`mX(@m7WLqir$BEuN;fR>{g~(V7Q$4*6d#
zF)`HH%@*dNXFqSsclOKP?Ki$Yzh)TX^FWMGT~w)c>5?sqN&n9_^n4TB)8==vznZ&B
zdVZ_Rw27LMu9JUnbb4YU{VIYzMljyh=|cII#SX`nZWNV!8$Y-&F)7gfTC8ODV%FQW
zH+}A!?3?vbF6GIU(u;T9CQsNc%MXv)Y%L<2
zl~_ZML|E;J=!jOE_oP;I=T+Y6x(9Nk?ml4Lqi8AqcSpk}r%uM_VdlsB{GF68Z~y!u
zDN&Iz`;b`j^G4=1PdsDSxFq@~K4oiRX$cCG|21)qqj`={kgSJ9@kFUPx0C8+1qz%#
zKXjb&B4M+eQx+5FVfL&S!U-K(7gAm|f4S!FF=fwETkZ>W^S4HMh<@SZuvlqXdUHyj
zz16+ut?zWUP5$=~+&(17=!0^WBhCQ#^w%*5_)uxlbwx%wuH{USn(^Atk
zu>(uKI5UqQ@k5&G%f6#$
zTpMk)WR_%T6q{6Xwe?tJyxF~k4fQ|TUb5~rJ91}FWTH2VVp8y{H=+xIGSCOaoyS_
z)w4EupY^mBeLSaRO(>t_qQbO8Z?-(ui`{l)SBXx=#iC_K0xb$M@>99a@2xf2Q1j`M
z+R}gL*)R1sy?oBNbl$wF!gtTL&Q?48Gp}AQ_*MV?8_C@BOq+z$k~({QjEY`w)t+Qx
z(Z9ERpTq^$J;!%uINeLuU%uYtp;*q`*#*|Swy(`L`sC!XY3mjF^(QVxIzKD+R{OlL
ze(%w>ic1e3(6ZgzEzO*&C4R!|d*wGfw*4Erc<*l&74K7X_Vcmc)>k{Z+DJ)g{@Uqr
zEmcvPk%2Pn%muox9b9z#`P{?l)xOs~#qQibmoBX_sebQ;C-E}&7cy3#)17uEoyULi
zUbFi6o!*z0JlMQOzBAcyi^}gd);D6ZJrmSKEGM4u44d}kgm)&}3HLv|n=GfXRcYB?
zcH4QsecFkIO)peF&w1xRb>jrZ{nx$1+b*5*J0>SCpW>QvG(}MBeK&{IOV
literal 0
HcmV?d00001
diff --git a/akka-docs/_static/logo.png b/akka-docs/_static/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..f9574199c0c3ed86409979fdd178740b72ffbb7f
GIT binary patch
literal 8112
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
+* `Support `_
diff --git a/akka-docs/manual/getting-started-first.rst b/akka-docs/manual/getting-started-first.rst
new file mode 100755
index 0000000000..7236db64a5
--- /dev/null
+++ b/akka-docs/manual/getting-started-first.rst
@@ -0,0 +1,347 @@
+Getting Started Tutorial: First Chapter
+=======================================
+
+Introduction
+------------
+
+Welcome to the first tutorial on how to get started with Akka and Scala. We assume that you already know what Akka and Scala is and will now focus on the steps necessary to start your first project.
+
+There are two variations of this first tutorial:
+
+- creating a standalone project and run it from the command line
+- creating a SBT (Simple Build Tool) project and running it from within SBT
+
+Since they are so similar we will present them both in this tutorial. The sample application that we will create is using actors to calculate the value of Pi. Is using an algorithm that is easily parallelizable and therefore suits the actor model very well, but is generic enough to suit as a starting point for all kinds of Master/Worker style problems.
+
+http://www.earldouglas.com/system/files/pi-series.png
+
+In this particular algorithm the master splits the series into chunks which are sent out to each worker actor to be processed, when each worker has processed its chunk it sends a result back to the master which aggregates to total result.
+
+Downloading and installing Akka
+-------------------------------
+
+The first thing we need to do is to download Akka. Let's get the 1.1 distribution from `http://akka.io/downloads `_. Once you have downloaded the distribution unzip it in the folder you would like to have Akka installed in, in my case I choose to install it in ``/Users/jboner/tools/``, simply by unzipping it to this directory.
+
+You need to do one more thing in order to install Akka properly and that is to set the ``AKKA_HOME`` environment variable to the root of the distribution. In my case I'm opening up a shell and navigating down to the distribution and setting the ``AKKA_HOME`` variable::
+
+ $ cd /Users/jboner/tools/akka-1.1
+ $ export AKKA_HOME=`pwd`
+ $ echo $AKKA_HOME
+ /Users/jboner/tools/akka-1.1
+
+If we now take a look at what we have in this distribution, looks like this::
+
+ $ ls -l
+ total 16944
+ drwxr-xr-x 7 jboner staff 238 Apr 6 11:15 .
+ drwxr-xr-x 28 jboner staff 952 Apr 6 11:16 ..
+ drwxr-xr-x 17 jboner staff 578 Apr 6 11:16 deploy
+ drwxr-xr-x 26 jboner staff 884 Apr 6 11:16 dist
+ drwxr-xr-x 3 jboner staff 102 Apr 6 11:15 lib_managed
+ -rwxr-xr-x 1 jboner staff 8674105 Apr 6 11:15 scala-library.jar
+ drwxr-xr-x 4 jboner staff 136 Apr 6 11:16 scripts
+
+- In the ``dist`` directory we have all the Akka JARs, including sources and docs.
+- In the ``lib_managed/compile`` directory we have all the Akka's dependency JARs.
+- In the ``deploy`` directory we have all the sample JARs.
+- In the ``scripts`` directory we have scripts for running Akka.
+- Finallly the ``scala-library.jar`` is the JAR for the latest Scala distribution that Akka depends on.
+
+Creating the messages
+---------------------
+
+First we need to create the messages is that we want to have flowing in the system. Let's create three different messages:
+
+- ``Calculate`` -- starts the calculation
+- ``Work`` -- contains the work assignment
+- ``Result`` -- contains the result from the worker's calculation
+
+Messages sent to actors should always be immutable to avoid sharing mutable state. In scala we have 'case classes' which make excellent messages. So let's start by creating three messages as case classes. We also create a common base trait for our messages (that we define as being ``sealed`` in order to prevent creating messages outside our control)::
+
+ sealed trait PiMessage
+
+ case object Calculate extends PiMessage
+
+ case class Work(arg: Int, nrOfElements: Int) extends PiMessage
+
+ case class Result(value: Double) extends PiMessage
+
+Creating the worker
+-------------------
+
+Now we can create the worker actor. This is done by mixing in the ``Actor`` trait and defining the ``receive`` method. The ``receive`` method defines our message handler. We expect it to be able to handle the ``Work`` message so we need to add a handler for this message::
+
+ class Worker extends Actor {
+ def receive = {
+ case Work(arg, nrOfElements) =>
+ self reply Result(calculatePiFor(arg, nrOfElements)) // perform the work
+ }
+ }
+
+As you can see we have now created an ``Actor`` with a ``receive`` method that as a handler for the ``Work`` message. In this handler we invoke the ``calculatePiFor(..)`` method, wraps the result in a ``Result`` message and sends it back to the original sender using ``self.reply``. In Akka the sender reference is implicitly passed along with the message so that the receiver can always reply or store away the sender reference use.
+
+The only thing missing in our ``Worker`` actor is the implementation on the ````calculatePiFor(..)`` method. There are many ways we can implement this algorithm in Scala, now let's try to balance functional programming with efficiency and use a tail recursive function::
+
+ def calculatePiFor(arg: Int, nrOfElements: Int): Double = {
+ val end = (arg + 1) * nrOfElements - 1
+
+ @tailrec def doCalculatePiFor(cursor: Int, acc: Double): Double = {
+ if (end == cursor) acc
+ else doCalculatePiFor(cursor + 1, acc + (4 * math.pow(-1, cursor) / (2 * cursor + 1)))
+ }
+
+ doCalculatePiFor(arg * nrOfElements, 0.0D)
+ }
+
+Here we use the classic trick with a local nested method to make sure that the compiler can perform a tail call optimization. We can ensure that the compiler will be able to do that by annotate tail recursive function with ``@tailrec``, with this annotation the compiler will emit an error if it can optimize it. With this implementation the calculation is really fast.
+
+Creating the master
+-------------------
+
+The master actor is a little bit more involved. In its constructor we need to create the workers (the ``Worker`` actors) and start them. We will also wrap them in a load-balancing router to make it easier to spread out the work evenly between the workers. Let's do that first::
+
+ // create the workers
+ val workers = Vector.fill(nrOfWorkers)(actorOf[Worker].start)
+
+ // wrap them with a load-balancing router
+ val router = Routing.loadBalancerActor(CyclicIterator(workers)).start
+
+As you can see we are using the ``actorOf`` factory method to create actors, this method returns as an ``ActorRef`` which is a reference to our newly created actor. This method is available in the ``Actor`` object but is usually imported::
+
+ import akka.actor.Actor._
+
+Now we have a routes are representing all our workers in a single abstraction. If you paid attention to the code above to see that we were using the ``nrOfWorkers`` variable. This variable and others we have to pass to the ``Master`` actor in its constructor. So now let's create the master actor. We had to pass in three integer variables needed:
+
+- ``nrOfWorkers`` -- defining how many workers we should start up
+- ``nrOfMessages`` -- defining how many numebr chunks should send out to the workers
+- ``nrOfElements`` -- defining how big the number chunks sent to each worker should be
+
+Let's not write the master actor::
+
+ class Master(nrOfWorkers: Int, nrOfMessages: Int, nrOfElements: Int, latch: CountDownLatch)
+ extends Actor {
+
+ var pi: Double = _
+ var nrOfResults: Int = _
+ var start: Long = _
+
+ // create the workers
+ val workers = Vector.fill(nrOfWorkers)(actorOf[Worker].start)
+
+ // wrap them with a load-balancing router
+ val router = Routing.loadBalancerActor(CyclicIterator(workers)).start
+
+ def receive = { ... }
+
+ override def preStart = start = now
+
+ override def postStop = {
+ // tell the world that the calculation is complete
+ println(
+ "\n\tPi estimate: \t\t%s\n\tCalculation time: \t%s millis"
+ .format(pi, (now - start)))
+ latch.countDown
+ }
+ }
+
+Couple of things are worth explaining further.
+
+First, we are passing in a ``java.util.concurrent.CountDownLatch`` to the ``Master`` actor. This latch is only used for plumbing, to have a simple way letting the outside world knowing when the master can deliver the result and shut down. In more idiomatic Akka code, as we will see in part two of this tutorial series, we would not use a latch.
+
+Second, we are adding a couple of lifecycle callback methods; ``preStart`` and ``postStop``. In the ``preStart`` callback we are recording the time when the actor is started and in the ``postStop`` callback we are printing out the result (the approximation of Pi) and the time it took to calculate it. In this call but we also invoke ``latch.countDown`` to tell the outside world that we are done.
+
+But we are not done yet. We are missing the message handler for the ``Master`` actor. This message handler needs to be able to react to two different messages:
+
+- ``Calculate`` -- which should start the calculation
+- ``Result`` -- which should aggregate the different results
+
+The ``Calculate`` handler is sending out work to all the ``Worker`` actors and after doing that also sends a ``Broadcast(PoisonPill)`` message to the router, this will make the route or send out the ``PoisonPill`` message to all the actors in this representing (in our case all the ``Worker`` actors). The ``PoisonPill`` is a special kind of message that tells the receiver to shut himself down using the normal shutdown; ``self.stop``. Then we also send a ``PoisonPill`` to the router itself (since it's also an actor that we want to shut down).
+
+The ``Result`` handler is simpler, here we just get the value from the ``Result`` message and aggregate it to our ``pi`` member variable. We also keep track of how many results we have received back and if it matches the number of tasks sent out the ``Master`` actor considers itself done and shuts himself down.
+
+Now, let's capture this in code::
+
+ // message handler
+ def receive = {
+ case Calculate =>
+ // schedule work
+ for (arg <- 0 until nrOfMessages) router ! Work(arg, nrOfElements)
+
+ // send a PoisonPill to all workers telling them to shut down themselves
+ router ! Broadcast(PoisonPill)
+
+ // send a PoisonPill to the router, telling him to shut himself down
+ router ! PoisonPill
+
+ case Result(value) =>
+ // handle result from the worker
+ pi += value
+ nrOfResults += 1
+ if (nrOfResults == nrOfMessages) self.stop
+ }
+
+Bootstrap the calculation
+-------------------------
+
+Now the only thing that is left to implement his the runner that should bootstrap and run his calculation for us. We do that by creating an object that we call ``Pi``, here we can extend the ``App`` trait in Scala which means that we will be able to run this as an application directly from the command line. The ``Pi`` object is a perfect container module for our actors and messages, so let's put them all there. We also create a method ``calculate`` in which we start up the ``Master`` actor and waits for it to finish::
+
+ object Pi extends App {
+
+ calculate(nrOfWorkers = 4, nrOfElements = 10000, nrOfMessages = 10000)
+
+ ... // actors and messages
+
+ def calculate(nrOfWorkers: Int, nrOfElements: Int, nrOfMessages: Int) {
+
+ // this latch is only plumbing to know when the calculation is completed
+ val latch = new CountDownLatch(1)
+
+ // create the master
+ val master = actorOf(new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch)).start
+
+ // start the calculation
+ master ! Calculate
+
+ // wait for master to shut down
+ latch.await
+ }
+ }
+
+That's it. Now we are done.
+
+But before we package it up and run it, let's take a look at the full code now, with package declaration, imports and all of::
+
+ package akka.tutorial.scala.first
+
+ import akka.actor.{Actor, ActorRef, PoisonPill}
+ import Actor._
+ import akka.routing.{Routing, CyclicIterator}
+ import Routing._
+ import akka.dispatch.Dispatchers
+
+ import System.{currentTimeMillis => now}
+ import java.util.concurrent.CountDownLatch
+
+ import scala.annotation.tailrec
+
+ object Pi extends App {
+
+ calculate(nrOfWorkers = 4, nrOfElements = 10000, nrOfMessages = 10000)
+
+ // ====================
+ // ===== Messages =====
+ // ====================
+ sealed trait PiMessage
+ case object Calculate extends PiMessage
+ case class Work(arg: Int, nrOfElements: Int) extends PiMessage
+ case class Result(value: Double) extends PiMessage
+
+ // ==================
+ // ===== Worker =====
+ // ==================
+ class Worker extends Actor {
+
+ // define the work
+ def calculatePiFor(arg: Int, nrOfElements: Int): Double = {
+ val end = (arg + 1) * nrOfElements - 1
+ @tailrec def doCalculatePiFor(cursor: Int, acc: Double): Double = {
+ if (end == cursor) acc
+ else doCalculatePiFor(cursor + 1, acc + (4 * math.pow(-1, cursor) / (2 * cursor + 1)))
+ }
+ doCalculatePiFor(arg * nrOfElements, 0.0D)
+ }
+
+ def receive = {
+ case Work(arg, nrOfElements) =>
+ self reply Result(calculatePiFor(arg, nrOfElements)) // perform the work
+ }
+ }
+
+ // ==================
+ // ===== Master =====
+ // ==================
+ class Master(nrOfWorkers: Int, nrOfMessages: Int, nrOfElements: Int, latch: CountDownLatch)
+ extends Actor {
+
+ var pi: Double = _
+ var nrOfResults: Int = _
+ var start: Long = _
+
+ // create the workers
+ val workers = Vector.fill(nrOfWorkers)(actorOf[Worker].start)
+
+ // wrap them with a load-balancing router
+ val router = Routing.loadBalancerActor(CyclicIterator(workers)).start
+
+ // message handler
+ def receive = {
+ case Calculate =>
+ // schedule work
+ for (arg <- 0 until nrOfMessages) router ! Work(arg, nrOfElements)
+
+ // send a PoisonPill to all workers telling them to shut down themselves
+ router ! Broadcast(PoisonPill)
+
+ // send a PoisonPill to the router, telling him to shut himself down
+ router ! PoisonPill
+
+ case Result(value) =>
+ // handle result from the worker
+ pi += value
+ nrOfResults += 1
+ if (nrOfResults == nrOfMessages) self.stop
+ }
+
+ override def preStart = start = now
+
+ override def postStop = {
+ // tell the world that the calculation is complete
+ println(
+ "\n\tPi estimate: \t\t%s\n\tCalculation time: \t%s millis"
+ .format(pi, (now - start)))
+ latch.countDown
+ }
+ }
+
+ // ==================
+ // ===== Run it =====
+ // ==================
+ def calculate(nrOfWorkers: Int, nrOfElements: Int, nrOfMessages: Int) {
+
+ // this latch is only plumbing to know when the calculation is completed
+ val latch = new CountDownLatch(1)
+
+ // create the master
+ val master = actorOf(new Master(nrOfWorkers, nrOfMessages, nrOfElements, latch)).start
+
+ // start the calculation
+ master ! Calculate
+
+ // wait for master to shut down
+ latch.await
+ }
+ }
+
+Run it as a command line application
+------------------------------------
+
+In order to run it as a stand-alone application you first need to copy the full code snippet above and put it into a file ``Pi.scala`` which you save in, for example, the ``$AKKA_HOME/tutorial`` directory (create the ``tutorial`` folder if it doesn't exist)::
+
+ $ cd akka-1.1
+ $ export AKKA_HOME=`pwd`
+ $ scalac -cp dist/akka-actor-1.1.jar tutorial/Pi.scala
+ $ java -cp dist/akka-actor-1.1.jar:scala-library.jar:tutorial akka.tutorial.scala.first.Pi
+ $ ...
+
+Run it inside SBT
+-----------------
+
+Run::
+
+ $ sbt
+ > update
+ > console
+ > akka.tutorial.scala.first.Pi.calculate(nrOfWorkers = 4, nrOfElements = 10000, nrOfMessages = 10000)
+ > ...
+ > :quit
+
diff --git a/akka-docs/manual/more.png b/akka-docs/manual/more.png
new file mode 100644
index 0000000000000000000000000000000000000000..3eb7b05c84809454c095bcb61b27d83585540bb2
GIT binary patch
literal 1502
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}EX7WqAsieW95oy%9SjT%
zk|nMYCBgY=CFO}lsSM@i<$9TU*~Q6;1*v-ZMd`EO*+?-kuoif_IEF;D9-S7QBN8fc
z{Qv!#H|O5ncIDoi)}U@yO|gadcDOt32;uP!OYU&HC?4rDuV$kA;y@ptD?gTWdM6!d
zS)tNm>KNkWAfk1NskLcJl-JAFd*v_7^oy!0szW@vcpba1`g{AYCmOj`=Rb%i<|)a>`yt`uO3u&M7Y
zj=cNJN+{#&k1dwpV;v?m-C9+Z`u4K^w8;Wz<>qhuv5!-LgGtNnY~C52wPMoK_XjQD
z_`2fwa?^YAj7l6r3LGpwayC=qInJ*#FEU;Jn*F?9?(N+5^UwWnIKKQTLxw_Qc;}1A
zG(FKZ=Wbm4A^7Vn_lBD-XW5FTCQVrS==rkuhlMwOT+g>>>H8h&jQ#%6zD&Q<#KN<;
zUiE(_dR}9(%~}D=b2S`67v=Xdbo+XkC2r)LexkWcM&@62{f{(_f(fc-zxVF4%w_EN
zFP?NDo%P)(UEc2avT$)-mn&RO&kcMen>803Sa8key^(V;joHw;uC
zpL1nv&!3apDgGzUw&XaI-25;fE<42OngL5*uGxcY
z@BFV!DN;${Re#7ZVYS#{6WyM^o(P6-%MUFV`S4@Q*3hF{Ur#@CcLB>;I|hcyTn&@$
zRjND143?CuJl80^=CGN&@X?o#9eKy@eb2wR-{X0TNXPx}cVExD^@Qv8;tdh)4P0!^
zGadw`IVifH5^dRcqq1jqvq1_AL%_1L%r7l1E*9A&&3ab0Km7jO&Z)Z0v$M6tM4mo-
zrj+o-VFDN1g!R)79?bh=edE+#&rL
zZp?jcx|
z&x^MmH_Z(%e`Q(p*lgDMxjf#Q(tqRrMwnHEF)qCD*mb99$_b5}Z2=EfxTM$5u3hnT
zH{-M$PrkqM?cAvUw&-)h8s^1S;%Pfy3(Cx$kbXPLNvCq|{nh6Ftmo%3y7eA@*r4Ye
z&?+3L+!R0SyVRM8SKnXNu5?!QZh0Gcrs#TdMZ%eV7w$yv%_@L)n>VXH=s%k2*ZqD7a~
z%Kdm8eNQY|Z^!4?GD*rsrD4kU#6Jx})4jHBm($3c6TSJx+lZ1oIsf;*eeFE|xL-f-
zAvT9h$rOf9W{Jzccg_^_KdDlXRsHz5Yv^g|SMmI_lh1YghV#q)G`J$jr)sQm>A^RX
zTV+*jmsltLePr2HeAasERo2Z@XDwVUZ0`4#vxI+3WSWieO34#bI=@WyW-v3pJ=xB~
z=uVr9it&>Zih&ygO2y6x-tA)c+7SNguKL#*lB~xc&UCr7R3~lP
+ {%- block akkarel1 %}
+ {%- endblock %}
+ {%- if prev %}
+ « {{ prev.title }}
+ ::
+ {%- endif %}
+ {{ _('Contents') }}
+ {%- if next %}
+ ::
+ {{ next.title }} »
+ {%- endif %}
+ {%- block akkarel2 %}
+ {%- endblock %}
+
+{% endmacro %}
+
+{% block content %}
+
+
+ {{ nav() }}
+
+
+ {#{%- if display_toc %}
+
+
Table Of Contents
+ {{ toc }}
+
+ {%- endif %}#}
+ {% block body %}{% endblock %}
+
+
+ {{ nav() }}
+
+{% endblock %}
diff --git a/akka-docs/themes/akka/pygments/akka.py b/akka-docs/themes/akka/pygments/akka.py
new file mode 100644
index 0000000000..af9fe61bf9
--- /dev/null
+++ b/akka-docs/themes/akka/pygments/akka.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+"""
+ pygments.styles.akka
+ ~~~~~~~~~~~~~~~~~~~~~~~~
+
+ Akka style for Scala highlighting.
+"""
+
+from pygments.style import Style
+from pygments.token import Keyword, Name, Comment, String, Error, \
+ Number, Operator, Generic, Whitespace
+
+
+class AkkaStyle(Style):
+ """
+ Akka style for Scala highlighting.
+ """
+
+ background_color = "#f0f0f0"
+ default_style = ""
+
+ styles = {
+ Whitespace: "#f0f0f0",
+ Comment: "#777766",
+ Comment.Preproc: "",
+ Comment.Special: "",
+
+ Keyword: "#000080",
+ Keyword.Pseudo: "",
+ Keyword.Type: "",
+
+ Operator: "#000000",
+ Operator.Word: "",
+
+ Name.Builtin: "#000000",
+ Name.Function: "#000000",
+ Name.Class: "#000000",
+ Name.Namespace: "#000000",
+ Name.Exception: "#000000",
+ Name.Variable: "#000000",
+ Name.Constant: "bold #000000",
+ Name.Label: "#000000",
+ Name.Entity: "#000000",
+ Name.Attribute: "#000000",
+ Name.Tag: "#000000",
+ Name.Decorator: "#000000",
+
+ String: "#008000",
+ String.Doc: "",
+ String.Interpol: "",
+ String.Escape: "",
+ String.Regex: "",
+ String.Symbol: "",
+ String.Other: "",
+ Number: "#008000",
+
+ Error: "border:#FF0000"
+ }
diff --git a/akka-docs/themes/akka/static/akka.css_t b/akka-docs/themes/akka/static/akka.css_t
new file mode 100644
index 0000000000..7c417e9917
--- /dev/null
+++ b/akka-docs/themes/akka/static/akka.css_t
@@ -0,0 +1,352 @@
+/*
+ * akka.css_t
+ */
+
+@import url("basic.css");
+
+html {
+ margin: 0px;
+ padding: 0px;
+ background: #FFF url(bg-page.png) top left repeat-x;
+}
+
+body {
+ line-height: 1.5;
+ margin: auto;
+ padding: 0px;
+ font-family: Helvetica, Arial, sans-serif;
+ min-width: 59em;
+ max-width: 70em;
+ color: {{ theme_textcolor }};
+}
+
+div.footer {
+ padding: 8px;
+ font-size: 11px;
+ text-align: center;
+ letter-spacing: 0.5px;
+}
+
+/* link colors and text decoration */
+
+a:link {
+ font-weight: bold;
+ text-decoration: none;
+ color: {{ theme_linkcolor }};
+}
+
+a:visited {
+ font-weight: bold;
+ text-decoration: none;
+ color: {{ theme_visitedlinkcolor }};
+}
+
+a:hover, a:active {
+ text-decoration: underline;
+ color: {{ theme_hoverlinkcolor }};
+}
+
+/* Some headers act as anchors, don't give them a hover effect */
+
+h1 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h2 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h3 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+h4 a:hover, a:active {
+ text-decoration: none;
+ color: {{ theme_headingcolor }};
+}
+
+a.headerlink {
+ color: #a7ce38;
+ padding-left: 5px;
+}
+
+a.headerlink:hover {
+ color: #a7ce38;
+}
+
+/* basic text elements */
+
+div.content {
+ margin-top: 20px;
+ margin-left: 40px;
+ margin-right: 40px;
+ margin-bottom: 50px;
+ font-size: 0.9em;
+}
+
+/* heading and navigation */
+
+div.header {
+ position: relative;
+ left: 0px;
+ top: 0px;
+ height: 85px;
+ /* background: #eeeeee; */
+ padding: 0 40px;
+}
+div.header h1 {
+ font-size: 1.6em;
+ font-weight: normal;
+ letter-spacing: 1px;
+ color: {{ theme_headingcolor }};
+ border: 0;
+ margin: 0;
+ padding-top: 15px;
+}
+div.header h1 a {
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+}
+div.header h2 {
+ font-size: 1.3em;
+ font-weight: normal;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ color: #aaa;
+ border: 0;
+ margin-top: -3px;
+ padding: 0;
+}
+
+div.header img.rightlogo {
+ float: right;
+}
+
+
+div.title {
+ font-size: 1.3em;
+ font-weight: bold;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-bottom: 25px;
+}
+div.topnav {
+ /* background: #e0e0e0; */
+}
+div.topnav p {
+ margin-top: 0;
+ margin-left: 40px;
+ margin-right: 40px;
+ margin-bottom: 0px;
+ text-align: right;
+ font-size: 0.8em;
+}
+div.bottomnav {
+ background: #eeeeee;
+}
+div.bottomnav p {
+ margin-right: 40px;
+ text-align: right;
+ font-size: 0.8em;
+}
+
+a.uplink {
+ font-weight: normal;
+}
+
+
+/* contents box */
+
+table.index {
+ margin: 0px 0px 30px 30px;
+ padding: 1px;
+ border-width: 1px;
+ border-style: dotted;
+ border-color: #e0e0e0;
+}
+table.index tr.heading {
+ background-color: #e0e0e0;
+ text-align: center;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+table.index tr.index {
+ background-color: #eeeeee;
+}
+table.index td {
+ padding: 5px 20px;
+}
+
+table.index a:link, table.index a:visited {
+ font-weight: normal;
+ text-decoration: none;
+ color: {{ theme_linkcolor }};
+}
+table.index a:hover, table.index a:active {
+ text-decoration: underline;
+ color: {{ theme_hoverlinkcolor }};
+}
+
+
+/* Akka Cloud Manual styles and layout */
+
+/* Rounded corner boxes */
+/* Common declarations */
+div.admonition {
+ -webkit-border-radius: 10px;
+ -khtml-border-radius: 10px;
+ -moz-border-radius: 10px;
+ border-radius: 10px;
+ border-style: dotted;
+ border-width: thin;
+ border-color: #dcdcdc;
+ padding: 10px 15px 10px 15px;
+ margin-bottom: 15px;
+ margin-top: 15px;
+}
+div.note {
+ padding: 10px 15px 10px 80px;
+ background: #e4ffde url(alert_info_32.png) 15px 15px no-repeat;
+ min-height: 42px;
+}
+div.warning {
+ padding: 10px 15px 10px 80px;
+ background: #fffbc6 url(alert_warning_32.png) 15px 15px no-repeat;
+ min-height: 42px;
+}
+div.seealso {
+ background: #e4ffde;
+}
+
+/* More layout and styles */
+h1 {
+ font-size: 1.3em;
+ font-weight: bold;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-top: 30px;
+}
+
+h2 {
+ font-size: 1.2em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ border-bottom: dotted thin #e0e0e0;
+ margin-top: 30px;
+}
+
+h3 {
+ font-size: 1.1em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ margin-top: 30px;
+}
+
+h4 {
+ font-size: 1.0em;
+ font-weight: normal;
+ color: {{ theme_headingcolor }};
+ margin-top: 30px;
+}
+
+p {
+ text-align: justify;
+}
+
+p.last {
+ margin-bottom: 0;
+}
+
+ol {
+ padding-left: 20px;
+}
+
+ul {
+ padding-left: 5px;
+ margin-top: 3px;
+}
+
+li {
+ line-height: 1.3;
+}
+
+div.content ul > li {
+ -moz-background-clip:border;
+ -moz-background-inline-policy:continuous;
+ -moz-background-origin:padding;
+ background: transparent url(bullet_orange.png) no-repeat scroll left 0.45em;
+ list-style-image: none;
+ list-style-type: none;
+ padding: 0 0 0 1.666em;
+ margin-bottom: 3px;
+}
+
+td {
+ vertical-align: top;
+}
+
+tt {
+ background-color: #e2e2e2;
+ font-size: 1.0em;
+ font-family: monospace;
+}
+
+pre {
+ border-color: #0c3762;
+ border-style: dotted;
+ border-width: thin;
+ margin: 0 0 12px 0;
+ padding: 0.8em;
+ background-color: #f0f0f0;
+}
+
+hr {
+ border-top: 1px solid #ccc;
+ border-bottom: 0;
+ border-right: 0;
+ border-left: 0;
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+/* printer only pretty stuff */
+@media print {
+ .noprint {
+ display: none;
+ }
+ /* for acronyms we want their definitions inlined at print time */
+ acronym[title]:after {
+ font-size: small;
+ content: " (" attr(title) ")";
+ font-style: italic;
+ }
+ /* and not have mozilla dotted underline */
+ acronym {
+ border: none;
+ }
+ div.topnav, div.bottomnav, div.header, table.index {
+ display: none;
+ }
+ div.content {
+ margin: 0px;
+ padding: 0px;
+ }
+ html {
+ background: #FFF;
+ }
+}
+
+.viewcode-back {
+ font-family: Helvetica, Arial, sans-serif;
+}
+
+div.viewcode-block:target {
+ background-color: #f4debf;
+ border-top: 1px solid #ac9;
+ border-bottom: 1px solid #ac9;
+ margin: -1px -12px;
+ padding: 0 12px;
+}
diff --git a/akka-docs/themes/akka/static/alert_info_32.png b/akka-docs/themes/akka/static/alert_info_32.png
new file mode 100644
index 0000000000000000000000000000000000000000..05b4fe898c39c93ca6041650c49dcb67e6595432
GIT binary patch
literal 1168
zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANMU;hrvzArXi7PS4K>EtNQK
z|3%5G>f-F>;rpu!s|ve?#ie+~rZ>i>+-Y00anDJ;-6@kzP42Wgj)y0F*w!-vO3d^Ynx*UY>B
zeh&A4x#R}12NDJ9XBIoC?FqY5A!XrMvQFpYW(m)%2z3PCweumEWFl$-pJhYNDc*e_mDC)$FCJ)k|KLPMSS$>eV?ys`t5~
zl~)9&@j#gh2>afj%L9{)E*S5%b=?R&WXQ!-L=swLt?T?e^E)rCM8SuqT=laxY_*hjA6h3OaUgq_()CG`?LV)3
zfNtbVK3nl)x5c(zl(`M!Q52)
zdO>v9b^X}|!75eG4XsVCO`=Wx-5dt0+N<~Lu6{c?^uB;-{ZmFA!8IZ|8cGh2b8jwT
zym=&g)2i1=ceV;7-1wh$@Yo^-8zz>w{_JnJpNbRQKka#a^gN*Z-zqty%KjkYo
zVd<}ws|){cv{gK?;eTnOHpE>B
zGiV6jsQEhd`n}a(`sQTaW=nn9`1`hgo$rx#ZU5T&7x=T>ZfCsYP~@_YZ4Z}9!}Y^H
z4El`z|B_!Mbr*Zp&AL2${_`nW@_V-befP6J_T=aNZW}yr_&tnbo#>cgZy;asSkXYa
znCZit=HU4!Pnz!bNV%Q3;l}Mi_m@}{cyhEMZSmg#qRkf2D8S<
zu{sE?sC%HB@$~f5SNbPR`##v~eTlEKJpW(spE{hj{TK3Q
zT)kn&hy4Pn;;x?CKj@!a{VFW-Gw;;%FT*3f*T=kRc(D7=qsff>1K20C=Nv!Aoj?79
zewWAej*?T}C8wvp;eEEySy?J*eCGD5_&WeX~=15k>Ht;^U
z?Z$XlPEKyx)vKX`g)Sw2F3Vl6OzSB2KN2_P?pbXkV@oaZ{Z-!Q=2*RAx+>CkevZd4
zBNJQp#&iV%HqC}74ss&xeoZPDXXb9&9L^!XJ0SP0`=XQOVcQhsnNyp$DSXh0xSP=0
zAmcIZ&RWY&!STWq&PJ7d=TcCR+QOvHds9Q?Qox3VJEzyDrw45GmS8;4Wy0hzy-mw0
zgMACH7N_;~fQ_deRz5Qo-6!;Kov0?~>O~v2If^=1D)6P2F3$U##gNB3C+XWMy`Km5
z{(Wn^c!#4Q=-Vmg1#?dw(5+t*7`>qDX7}U96Vn+=ei}0yNHHzgs{Z-XzujpfZv&SH
ziWb1x(k|)9YxncI+w>PWV
zTZ|kcw-++_Jrydtt6wH~DB0oghIv*8=6<)^b*lHM#I1AU{tXsO7jp&}E=)X7c4{5B
z!UN;)FONK#_4lSZxBmaV^AhVNs&4t}9NsJ4@}`XEaEtWowR=9MPWj5>eBkSH)`DLr
z65gM<@q#nX_R`ra@zQ&0-$~{EcKT9cBFN>WC6}BdweN@K;Uhwv2{JR*vL5*ExM}AH
zzSz5OSG-{kDQdr)F~`0x{>h*7-ZIi}QeQr^YClx)hqdFGvdrI<)wgDCWjt{xQ=oN=
zTfo7v61CRNlNELgCg(ll)0+CI;J4T^&foLp6-tWsr7`^f-cYn)!ZDAdnL@o=&BK8W_3eFvzXMV=IoK8QlU-*4~&Qd0Zia4h{`2&xx?~FA+yw^oQf`RSNyT*$j
zR~|Wa;(PXA-DxG?N?BiKm^ONepSjzg%w{z+VvFU!e|IfDSO(lsb`kk;k>7#2_`r)F
zB}J(zI`{5hdQ{|X^V;-9xqosX=yJMP>wsLakziDZA
zZ;EpoRsNM*Upr@IXbhu01LunMolyroAH*&=tNc%W1KS>sFF*hMpC07oFC%v0<=q7Q*Uof2xMSjVDNPHb6Mw<&;$U;JodT(
literal 0
HcmV?d00001
diff --git a/akka-docs/themes/akka/static/bg-page.png b/akka-docs/themes/akka/static/bg-page.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6f3bc477c157a0b57bb96e77af53e84f60474cf
GIT binary patch
literal 164
zcmeAS@N?(olHy`uVBq!ia0y~yVBle3V94NLVqjqKDr)<~z`($g?~tz_78O`%fY(
z0|NtRfk$L90|U1(2s1Lwnj^u$z`$PO>FdgVlS5p9OGr@rrw{`JgR!TJV~EG`w-+|@
zGAQt{Y;3que>L1Jfn|kq{M%Pyld879R_16@03)>pm+#s+PQJ*Rox@fnxkUUr0|Ntt
Mr>mdKI;Vst0Ii8E3;+NC
literal 0
HcmV?d00001
diff --git a/akka-docs/themes/akka/static/bullet_orange.png b/akka-docs/themes/akka/static/bullet_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..ad5d02f341dfcd8fec482e500170bb711257f0b9
GIT binary patch
literal 365
zcmeAS@N?(olHy`uVBq!ia0y~yU|<7b4rT@hhU-G|RSXOa2?0JKt`F+8{-2rre|PSK
zmG$4>JpDh%{QteJ{|`2O-&z0v#_IPSTK|uB|KC&fe@ou~)2;tLK7G}y^?#ww|D$dH
zAMW|TzvTay7mruf|NsA=0SB1!XnqR=0|R4{x4VlxE3d#_1_lPs0*}aI1_lNXFm^kc
zZ3hx8D{xE)IT4JfUi>+Ufq_Ba)5S4_<2vg>P9_Ec4weI@Z4+Al+h66;TRo}aW|4lt
z?Bk|Os{XL8*ljDfM5pBkqbdvIEH*Xka|{d&swJ)wB`Jv|saDBFsfi`23`Pcq2D%1@
zx(4PUhDKH