Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Create gh-pages branch via GitHub

  • Loading branch information...
commit 5dfe873921c300452709dc4a77be0de0a3d6e45a 0 parents
@eallik authored
178 index.html
@@ -0,0 +1,178 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="chrome=1">
+ <title>Spinoff by eallik</title>
+
+ <link rel="stylesheet" href="stylesheets/styles.css">
+ <link rel="stylesheet" href="stylesheets/pygment_trac.css">
+ <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
+ <!--[if lt IE 9]>
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ </head>
+ <body>
+ <div class="wrapper">
+ <header>
+ <h1>Spinoff</h1>
+ <p>Spinoff is a framework for writing distributed, fault tolerant and scalable applications in Python. Spinoff is based on the Actor Model and borrows from Akka (location transparency, actor references, etc) and Erlang (processes, nodename@hosthost style node references (not implemented yet)). </p>
+
+ <p class="view"><a href="https://github.com/eallik/spinoff">View the Project on GitHub <small>eallik/spinoff</small></a></p>
+
+
+ <ul>
+ <li><a href="https://github.com/eallik/spinoff/zipball/master">Download <strong>ZIP File</strong></a></li>
+ <li><a href="https://github.com/eallik/spinoff/tarball/master">Download <strong>TAR Ball</strong></a></li>
+ <li><a href="https://github.com/eallik/spinoff">View On <strong>GitHub</strong></a></li>
+ </ul>
+ </header>
+ <section>
+ <h1>Overview</h1>
+
+<p>Spinoff is a framework for writing distributed, fault tolerant and scalable applications in Python. Spinoff is based on the <a href="http://en.wikipedia.org/wiki/Actor_model">Actor Model</a> and borrows from <a href="http://akka.io">Akka</a> (location transparency, actor references, etc) and <a href="http://en.wikipedia.org/wiki/Erlang_(programming_language">Erlang</a>) (processes, <code>nodename@hosthost</code> style node references (not implemented yet)).</p>
+
+<p>Spinoff has been built using <a href="http://twistedmatrix.com/">Twisted</a> as the underlying framework and <a href="http://www.zeromq.org/">ZeroMQ</a> (via <code>pyzmq</code> and a fork of <code>txzmq</code>) for remoting.</p>
+
+<p>Spinoff is currently under continuous development but is nevertheless usable for writing real applications—its fault tolerance features also protect it against bugs in its own code.</p>
+
+<h1>Example</h1>
+
+<p>The following is only a very small "peek preview" style example of what the framework can do. More examples and full documentation will follow soon.</p>
+
+<div class="highlight"><pre><span class="c"># spinoff/examples/example1.py</span>
+<span class="kn">from</span> <span class="nn">spinoff.actor</span> <span class="kn">import</span> <span class="n">Actor</span>
+<span class="kn">from</span> <span class="nn">spinoff.actor.process</span> <span class="kn">import</span> <span class="n">Process</span>
+<span class="kn">from</span> <span class="nn">spinoff.util.logging</span> <span class="kn">import</span> <span class="n">dbg</span>
+<span class="kn">from</span> <span class="nn">spinoff.util.async</span> <span class="kn">import</span> <span class="n">sleep</span><span class="p">,</span> <span class="n">with_timeout</span>
+
+
+<span class="k">class</span> <span class="nc">ExampleProcess</span><span class="p">(</span><span class="n">Process</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">child</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">ExampleActor</span><span class="p">)</span>
+
+ <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"sending greeting to </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">child</span><span class="p">,))</span>
+ <span class="n">child</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="s">'hello!'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ref</span><span class="p">)</span>
+
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"waiting for ack from </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">child</span><span class="p">,))</span>
+ <span class="k">yield</span> <span class="n">with_timeout</span><span class="p">(</span><span class="mf">5.0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'ack'</span><span class="p">))</span>
+
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"got 'ack' from </span><span class="si">%r</span><span class="s">; now sleeping a bit..."</span> <span class="o">%</span> <span class="p">(</span><span class="n">child</span><span class="p">,))</span>
+ <span class="k">yield</span> <span class="n">sleep</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">ExampleActor</span><span class="p">(</span><span class="n">Actor</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">pre_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"starting"</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+ <span class="n">content</span><span class="p">,</span> <span class="n">sender</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"</span><span class="si">%r</span><span class="s"> from </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">sender</span><span class="p">))</span>
+ <span class="n">sender</span> <span class="o">&lt;&lt;</span> <span class="s">'ack'</span>
+
+ <span class="k">def</span> <span class="nf">post_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"stopping"</span><span class="p">)</span>
+</pre></div>
+
+<p>The example can be run using the following command:</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd --nodaemon startnode --actor spinoff.examples.example1.ExampleProcess
+</pre></div>
+
+<p>or</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd -n startnode -a spinoff.examples.example1.ExampleProcess
+</pre></div>
+
+<h1>Distributed Example (with Remoting)</h1>
+
+<div class="highlight"><pre><span class="c"># spinoff/examples/example2.py</span>
+<span class="kn">from</span> <span class="nn">spinoff.actor</span> <span class="kn">import</span> <span class="n">Actor</span>
+<span class="kn">from</span> <span class="nn">spinoff.actor.process</span> <span class="kn">import</span> <span class="n">Process</span>
+<span class="kn">from</span> <span class="nn">spinoff.util.logging</span> <span class="kn">import</span> <span class="n">dbg</span>
+<span class="kn">from</span> <span class="nn">spinoff.util.async</span> <span class="kn">import</span> <span class="n">sleep</span><span class="p">,</span> <span class="n">with_timeout</span>
+
+
+<span class="k">class</span> <span class="nc">ExampleProcess</span><span class="p">(</span><span class="n">Process</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other_actor</span><span class="p">):</span>
+ <span class="n">other_actor</span> <span class="o">=</span> <span class="n">lookup</span><span class="p">(</span><span class="n">other_actor</span><span class="p">)</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other_actor</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">other_actor</span>
+ <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"sending greeting to </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">other_actor</span><span class="p">,))</span>
+ <span class="n">other_actor</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="s">'hello!'</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">ref</span><span class="p">)</span>
+
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"waiting for ack from </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">other_actor</span><span class="p">,))</span>
+ <span class="k">yield</span> <span class="n">with_timeout</span><span class="p">(</span><span class="mf">5.0</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'ack'</span><span class="p">))</span>
+
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"got 'ack' from </span><span class="si">%r</span><span class="s">; now sleeping a bit..."</span> <span class="o">%</span> <span class="p">(</span><span class="n">other_actor</span><span class="p">,))</span>
+ <span class="k">yield</span> <span class="n">sleep</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">ExampleActor</span><span class="p">(</span><span class="n">Actor</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">pre_start</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"starting"</span><span class="p">)</span>
+
+ <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+ <span class="n">content</span><span class="p">,</span> <span class="n">sender</span> <span class="o">=</span> <span class="n">msg</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"</span><span class="si">%r</span><span class="s"> from </span><span class="si">%r</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">sender</span><span class="p">))</span>
+ <span class="n">sender</span> <span class="o">&lt;&lt;</span> <span class="s">'ack'</span>
+
+ <span class="k">def</span> <span class="nf">post_stop</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"stopping"</span><span class="p">)</span>
+</pre></div>
+
+<p>The example can be run using the following commands:</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd --pidfile node1.pid --nodaemon startnode --remoting localhost:9700 --actor spinoff.examples.example2.ExampleActor --name other
+<span class="nv">$ </span>twistd --pidfile node2.pid --nodaemon startnode --remoting localhost:9701 --actor spinoff.examples.example2.ExampleProcess --params <span class="s2">"other_actor='localhost:9700/other'"</span>
+</pre></div>
+
+<p>or</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd --pidfile node1.pid -n startnode -r :9700 -a spinoff.examples.example2.ExampleActor -n other
+<span class="nv">$ </span>twistd --pidfile node2.pid -n startnode -r :9701 -a spinoff.examples.example2.ExampleProcess -i <span class="s2">"other_actor='localhost:9700/other'"</span>
+</pre></div>
+
+<h1>Same Distributed Code without Remoting</h1>
+
+<p>The following example demonstrates how it's possible to run the same code, unmodified, in a single thread with no network/remoting involved whatsoever. It's an illustration of how actors (components) written using Spinoff are xagnostic of how they are wired to work with other actors and can thus be viewed as abstract components containing only pure domain logic and no low level transportation and topology details.</p>
+
+<div class="highlight"><pre><span class="c"># spinoff/examples/example2_local.py</span>
+<span class="kn">from</span> <span class="nn">spinoff.actor.process</span> <span class="kn">import</span> <span class="n">Process</span>
+<span class="kn">from</span> <span class="nn">spinoff.util.logging</span> <span class="kn">import</span> <span class="n">dbg</span>
+
+<span class="kn">from</span> <span class="nn">.example2</span> <span class="kn">import</span> <span class="n">ExampleProcess</span><span class="p">,</span> <span class="n">ExampleActor</span>
+
+
+<span class="k">class</span> <span class="nc">LocalApp</span><span class="p">(</span><span class="n">Process</span><span class="p">):</span>
+ <span class="k">def</span> <span class="nf">run</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"spawning ExampleActor"</span><span class="p">)</span>
+ <span class="n">actor1</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">ExampleActor</span><span class="p">)</span>
+
+ <span class="n">dbg</span><span class="p">(</span><span class="s">"spawning ExampleProcess"</span><span class="p">)</span>
+ <span class="bp">self</span><span class="o">.</span><span class="n">spawn</span><span class="p">(</span><span class="n">ExampleProcess</span><span class="o">.</span><span class="n">using</span><span class="p">(</span><span class="n">other_actor</span><span class="o">=</span><span class="n">actor1</span><span class="p">))</span>
+
+ <span class="k">yield</span> <span class="bp">self</span><span class="o">.</span><span class="n">get</span><span class="p">()</span> <span class="c"># so that the entire app wouldn't exit immediately</span>
+</pre></div>
+
+<p>The example can be run using the following commands:</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd --nodaemon startnode --actor spinoff.examples.example2_local.LocalApp
+</pre></div>
+
+<p>or</p>
+
+<div class="highlight"><pre><span class="nv">$ </span>twistd -n startnode -a spinoff.examples.example2_local.LocalApp
+</pre></div>
+
+<p>One might be tempted to ask, then, what is the difference between remoting frameworks such as CORBA and Spinoff. The difference is that actors define clear boundaries where remoting could ever be used, as opposed to splitting a flow of tightly coupled logic into two nodes on the network, which, still providing valid output, can degrade in performance significantly. This is not to say that actors with location transparency suffer none of such issues but the extent to which the problem exists is, arguably, an order of magnitude lower.</p>
+ </section>
+ <footer>
+ <p>This project is maintained by <a href="https://github.com/eallik">eallik</a></p>
+ <p><small>Hosted on GitHub Pages &mdash; Theme by <a href="https://github.com/orderedlist">orderedlist</a></small></p>
+ </footer>
+ </div>
+ <script src="javascripts/scale.fix.js"></script>
+
+ </body>
+</html>
17 javascripts/scale.fix.js
@@ -0,0 +1,17 @@
+var metas = document.getElementsByTagName('meta');
+var i;
+if (navigator.userAgent.match(/iPhone/i)) {
+ for (i=0; i<metas.length; i++) {
+ if (metas[i].name == "viewport") {
+ metas[i].content = "width=device-width, minimum-scale=1.0, maximum-scale=1.0";
+ }
+ }
+ document.addEventListener("gesturestart", gestureStart, false);
+}
+function gestureStart() {
+ for (i=0; i<metas.length; i++) {
+ if (metas[i].name == "viewport") {
+ metas[i].content = "width=device-width, minimum-scale=0.25, maximum-scale=1.6";
+ }
+ }
+}
1  params.json
@@ -0,0 +1 @@
+{"note":"Don't delete this file! It's used internally to help with page regeneration.","google":"","name":"Spinoff","tagline":"Spinoff is a framework for writing distributed, fault tolerant and scalable applications in Python. Spinoff is based on the Actor Model and borrows from Akka (location transparency, actor references, etc) and Erlang (processes, nodename@hosthost style node references (not implemented yet)). ","body":"Overview\r\n========\r\n\r\nSpinoff is a framework for writing distributed, fault tolerant and scalable applications in Python. Spinoff is based on the [Actor Model](http://en.wikipedia.org/wiki/Actor_model) and borrows from [Akka](http://akka.io) (location transparency, actor references, etc) and [Erlang](http://en.wikipedia.org/wiki/Erlang_(programming_language)) (processes, `nodename@hosthost` style node references (not implemented yet)).\r\n\r\nSpinoff has been built using [Twisted](http://twistedmatrix.com/) as the underlying framework and [ZeroMQ](http://www.zeromq.org/) (via `pyzmq` and a fork of `txzmq`) for remoting.\r\n\r\nSpinoff is currently under continuous development but is nevertheless usable for writing real applications—its fault tolerance features also protect it against bugs in its own code.\r\n\r\n\r\nExample\r\n=======\r\n\r\nThe following is only a very small \"peek preview\" style example of what the framework can do. More examples and full documentation will follow soon.\r\n\r\n```python\r\n# spinoff/examples/example1.py\r\nfrom spinoff.actor import Actor\r\nfrom spinoff.actor.process import Process\r\nfrom spinoff.util.logging import dbg\r\nfrom spinoff.util.async import sleep, with_timeout\r\n\r\n\r\nclass ExampleProcess(Process):\r\n def run(self):\r\n child = self.spawn(ExampleActor)\r\n\r\n while True:\r\n dbg(\"sending greeting to %r\" % (child,))\r\n child << ('hello!', self.ref)\r\n\r\n dbg(\"waiting for ack from %r\" % (child,))\r\n yield with_timeout(5.0, self.get('ack'))\r\n\r\n dbg(\"got 'ack' from %r; now sleeping a bit...\" % (child,))\r\n yield sleep(1.0)\r\n\r\n\r\nclass ExampleActor(Actor):\r\n def pre_start(self):\r\n dbg(\"starting\")\r\n\r\n def receive(self, msg):\r\n content, sender = msg\r\n dbg(\"%r from %r\" % (content, sender))\r\n sender << 'ack'\r\n\r\n def post_stop(self):\r\n dbg(\"stopping\")\r\n```\r\n\r\nThe example can be run using the following command:\r\n\r\n```bash\r\n$ twistd --nodaemon startnode --actor spinoff.examples.example1.ExampleProcess\r\n```\r\n\r\nor\r\n\r\n```bash\r\n$ twistd -n startnode -a spinoff.examples.example1.ExampleProcess\r\n```\r\n\r\nDistributed Example (with Remoting)\r\n===================================\r\n\r\n```python\r\n# spinoff/examples/example2.py\r\nfrom spinoff.actor import Actor\r\nfrom spinoff.actor.process import Process\r\nfrom spinoff.util.logging import dbg\r\nfrom spinoff.util.async import sleep, with_timeout\r\n\r\n\r\nclass ExampleProcess(Process):\r\n def run(self, other_actor):\r\n other_actor = lookup(other_actor) if isinstance(other_actor, str) else other_actor\r\n while True:\r\n dbg(\"sending greeting to %r\" % (other_actor,))\r\n other_actor << ('hello!', self.ref)\r\n\r\n dbg(\"waiting for ack from %r\" % (other_actor,))\r\n yield with_timeout(5.0, self.get('ack'))\r\n\r\n dbg(\"got 'ack' from %r; now sleeping a bit...\" % (other_actor,))\r\n yield sleep(1.0)\r\n\r\n\r\nclass ExampleActor(Actor):\r\n def pre_start(self):\r\n dbg(\"starting\")\r\n\r\n def receive(self, msg):\r\n content, sender = msg\r\n dbg(\"%r from %r\" % (content, sender))\r\n sender << 'ack'\r\n\r\n def post_stop(self):\r\n dbg(\"stopping\")\r\n```\r\n\r\nThe example can be run using the following commands:\r\n\r\n```bash\r\n$ twistd --pidfile node1.pid --nodaemon startnode --remoting localhost:9700 --actor spinoff.examples.example2.ExampleActor --name other\r\n$ twistd --pidfile node2.pid --nodaemon startnode --remoting localhost:9701 --actor spinoff.examples.example2.ExampleProcess --params \"other_actor='localhost:9700/other'\"\r\n```\r\n\r\nor\r\n\r\n```bash\r\n$ twistd --pidfile node1.pid -n startnode -r :9700 -a spinoff.examples.example2.ExampleActor -n other\r\n$ twistd --pidfile node2.pid -n startnode -r :9701 -a spinoff.examples.example2.ExampleProcess -i \"other_actor='localhost:9700/other'\"\r\n```\r\n\r\nSame Distributed Code without Remoting\r\n======================================\r\n\r\nThe following example demonstrates how it's possible to run the same code, unmodified, in a single thread with no network/remoting involved whatsoever. It's an illustration of how actors (components) written using Spinoff are xagnostic of how they are wired to work with other actors and can thus be viewed as abstract components containing only pure domain logic and no low level transportation and topology details.\r\n\r\n```python\r\n# spinoff/examples/example2_local.py\r\nfrom spinoff.actor.process import Process\r\nfrom spinoff.util.logging import dbg\r\n\r\nfrom .example2 import ExampleProcess, ExampleActor\r\n\r\n\r\nclass LocalApp(Process):\r\n def run(self):\r\n dbg(\"spawning ExampleActor\")\r\n actor1 = self.spawn(ExampleActor)\r\n\r\n dbg(\"spawning ExampleProcess\")\r\n self.spawn(ExampleProcess.using(other_actor=actor1))\r\n\r\n yield self.get() # so that the entire app wouldn't exit immediately\r\n```\r\n\r\nThe example can be run using the following commands:\r\n\r\n```bash\r\n$ twistd --nodaemon startnode --actor spinoff.examples.example2_local.LocalApp\r\n```\r\n\r\nor\r\n\r\n```bash\r\n$ twistd -n startnode -a spinoff.examples.example2_local.LocalApp\r\n```\r\n\r\nOne might be tempted to ask, then, what is the difference between remoting frameworks such as CORBA and Spinoff. The difference is that actors define clear boundaries where remoting could ever be used, as opposed to splitting a flow of tightly coupled logic into two nodes on the network, which, still providing valid output, can degrade in performance significantly. This is not to say that actors with location transparency suffer none of such issues but the extent to which the problem exists is, arguably, an order of magnitude lower.\r\n"}
69 stylesheets/pygment_trac.css
@@ -0,0 +1,69 @@
+.highlight { background: #ffffff; }
+.highlight .c { color: #999988; font-style: italic } /* Comment */
+.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
+.highlight .k { font-weight: bold } /* Keyword */
+.highlight .o { font-weight: bold } /* Operator */
+.highlight .cm { color: #999988; font-style: italic } /* Comment.Multiline */
+.highlight .cp { color: #999999; font-weight: bold } /* Comment.Preproc */
+.highlight .c1 { color: #999988; font-style: italic } /* Comment.Single */
+.highlight .cs { color: #999999; font-weight: bold; font-style: italic } /* Comment.Special */
+.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
+.highlight .gd .x { color: #000000; background-color: #ffaaaa } /* Generic.Deleted.Specific */
+.highlight .ge { font-style: italic } /* Generic.Emph */
+.highlight .gr { color: #aa0000 } /* Generic.Error */
+.highlight .gh { color: #999999 } /* Generic.Heading */
+.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
+.highlight .gi .x { color: #000000; background-color: #aaffaa } /* Generic.Inserted.Specific */
+.highlight .go { color: #888888 } /* Generic.Output */
+.highlight .gp { color: #555555 } /* Generic.Prompt */
+.highlight .gs { font-weight: bold } /* Generic.Strong */
+.highlight .gu { color: #800080; font-weight: bold; } /* Generic.Subheading */
+.highlight .gt { color: #aa0000 } /* Generic.Traceback */
+.highlight .kc { font-weight: bold } /* Keyword.Constant */
+.highlight .kd { font-weight: bold } /* Keyword.Declaration */
+.highlight .kn { font-weight: bold } /* Keyword.Namespace */
+.highlight .kp { font-weight: bold } /* Keyword.Pseudo */
+.highlight .kr { font-weight: bold } /* Keyword.Reserved */
+.highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */
+.highlight .m { color: #009999 } /* Literal.Number */
+.highlight .s { color: #d14 } /* Literal.String */
+.highlight .na { color: #008080 } /* Name.Attribute */
+.highlight .nb { color: #0086B3 } /* Name.Builtin */
+.highlight .nc { color: #445588; font-weight: bold } /* Name.Class */
+.highlight .no { color: #008080 } /* Name.Constant */
+.highlight .ni { color: #800080 } /* Name.Entity */
+.highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */
+.highlight .nf { color: #990000; font-weight: bold } /* Name.Function */
+.highlight .nn { color: #555555 } /* Name.Namespace */
+.highlight .nt { color: #000080 } /* Name.Tag */
+.highlight .nv { color: #008080 } /* Name.Variable */
+.highlight .ow { font-weight: bold } /* Operator.Word */
+.highlight .w { color: #bbbbbb } /* Text.Whitespace */
+.highlight .mf { color: #009999 } /* Literal.Number.Float */
+.highlight .mh { color: #009999 } /* Literal.Number.Hex */
+.highlight .mi { color: #009999 } /* Literal.Number.Integer */
+.highlight .mo { color: #009999 } /* Literal.Number.Oct */
+.highlight .sb { color: #d14 } /* Literal.String.Backtick */
+.highlight .sc { color: #d14 } /* Literal.String.Char */
+.highlight .sd { color: #d14 } /* Literal.String.Doc */
+.highlight .s2 { color: #d14 } /* Literal.String.Double */
+.highlight .se { color: #d14 } /* Literal.String.Escape */
+.highlight .sh { color: #d14 } /* Literal.String.Heredoc */
+.highlight .si { color: #d14 } /* Literal.String.Interpol */
+.highlight .sx { color: #d14 } /* Literal.String.Other */
+.highlight .sr { color: #009926 } /* Literal.String.Regex */
+.highlight .s1 { color: #d14 } /* Literal.String.Single */
+.highlight .ss { color: #990073 } /* Literal.String.Symbol */
+.highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */
+.highlight .vc { color: #008080 } /* Name.Variable.Class */
+.highlight .vg { color: #008080 } /* Name.Variable.Global */
+.highlight .vi { color: #008080 } /* Name.Variable.Instance */
+.highlight .il { color: #009999 } /* Literal.Number.Integer.Long */
+
+.type-csharp .highlight .k { color: #0000FF }
+.type-csharp .highlight .kt { color: #0000FF }
+.type-csharp .highlight .nf { color: #000000; font-weight: normal }
+.type-csharp .highlight .nc { color: #2B91AF }
+.type-csharp .highlight .nn { color: #000000 }
+.type-csharp .highlight .s { color: #A31515 }
+.type-csharp .highlight .sc { color: #A31515 }
255 stylesheets/styles.css
@@ -0,0 +1,255 @@
+@import url(https://fonts.googleapis.com/css?family=Lato:300italic,700italic,300,700);
+
+body {
+ padding:50px;
+ font:14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif;
+ color:#777;
+ font-weight:300;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color:#222;
+ margin:0 0 20px;
+}
+
+p, ul, ol, table, pre, dl {
+ margin:0 0 20px;
+}
+
+h1, h2, h3 {
+ line-height:1.1;
+}
+
+h1 {
+ font-size:28px;
+}
+
+h2 {
+ color:#393939;
+}
+
+h3, h4, h5, h6 {
+ color:#494949;
+}
+
+a {
+ color:#39c;
+ font-weight:400;
+ text-decoration:none;
+}
+
+a small {
+ font-size:11px;
+ color:#777;
+ margin-top:-0.6em;
+ display:block;
+}
+
+.wrapper {
+ width:860px;
+ margin:0 auto;
+}
+
+blockquote {
+ border-left:1px solid #e5e5e5;
+ margin:0;
+ padding:0 0 0 20px;
+ font-style:italic;
+}
+
+code, pre {
+ font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal;
+ color:#333;
+ font-size:12px;
+}
+
+pre {
+ padding:8px 15px;
+ background: #f8f8f8;
+ border-radius:5px;
+ border:1px solid #e5e5e5;
+ overflow-x: auto;
+}
+
+table {
+ width:100%;
+ border-collapse:collapse;
+}
+
+th, td {
+ text-align:left;
+ padding:5px 10px;
+ border-bottom:1px solid #e5e5e5;
+}
+
+dt {
+ color:#444;
+ font-weight:700;
+}
+
+th {
+ color:#444;
+}
+
+img {
+ max-width:100%;
+}
+
+header {
+ width:270px;
+ float:left;
+ position:fixed;
+}
+
+header ul {
+ list-style:none;
+ height:40px;
+
+ padding:0;
+
+ background: #eee;
+ background: -moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(100%,#dddddd));
+ background: -webkit-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
+ background: -o-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
+ background: -ms-linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
+ background: linear-gradient(top, #f8f8f8 0%,#dddddd 100%);
+
+ border-radius:5px;
+ border:1px solid #d2d2d2;
+ box-shadow:inset #fff 0 1px 0, inset rgba(0,0,0,0.03) 0 -1px 0;
+ width:270px;
+}
+
+header li {
+ width:89px;
+ float:left;
+ border-right:1px solid #d2d2d2;
+ height:40px;
+}
+
+header ul a {
+ line-height:1;
+ font-size:11px;
+ color:#999;
+ display:block;
+ text-align:center;
+ padding-top:6px;
+ height:40px;
+}
+
+strong {
+ color:#222;
+ font-weight:700;
+}
+
+header ul li + li {
+ width:88px;
+ border-left:1px solid #fff;
+}
+
+header ul li + li + li {
+ border-right:none;
+ width:89px;
+}
+
+header ul a strong {
+ font-size:14px;
+ display:block;
+ color:#222;
+}
+
+section {
+ width:500px;
+ float:right;
+ padding-bottom:50px;
+}
+
+small {
+ font-size:11px;
+}
+
+hr {
+ border:0;
+ background:#e5e5e5;
+ height:1px;
+ margin:0 0 20px;
+}
+
+footer {
+ width:270px;
+ float:left;
+ position:fixed;
+ bottom:50px;
+}
+
+@media print, screen and (max-width: 960px) {
+
+ div.wrapper {
+ width:auto;
+ margin:0;
+ }
+
+ header, section, footer {
+ float:none;
+ position:static;
+ width:auto;
+ }
+
+ header {
+ padding-right:320px;
+ }
+
+ section {
+ border:1px solid #e5e5e5;
+ border-width:1px 0;
+ padding:20px 0;
+ margin:0 0 20px;
+ }
+
+ header a small {
+ display:inline;
+ }
+
+ header ul {
+ position:absolute;
+ right:50px;
+ top:52px;
+ }
+}
+
+@media print, screen and (max-width: 720px) {
+ body {
+ word-wrap:break-word;
+ }
+
+ header {
+ padding:0;
+ }
+
+ header ul, header p.view {
+ position:static;
+ }
+
+ pre, code {
+ word-wrap:normal;
+ }
+}
+
+@media print, screen and (max-width: 480px) {
+ body {
+ padding:15px;
+ }
+
+ header ul {
+ display:none;
+ }
+}
+
+@media print {
+ body {
+ padding:0.4in;
+ font-size:12pt;
+ color:#444;
+ }
+}
Please sign in to comment.
Something went wrong with that request. Please try again.