Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save e-oz/18546cd50fa02d08623bb847f94e4d3a to your computer and use it in GitHub Desktop.
Save e-oz/18546cd50fa02d08623bb847f94e4d3a to your computer and use it in GitHub Desktop.
From: <Saved by Blink>
Subject: Deploying a Rust App to Google App Engine
Date: Sun, 2 Apr 2016 14:43:06 -0000
MIME-Version: 1.0
Content-Type: multipart/related;
type="text/html";
boundary="----MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----"
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: text/html
Content-ID: <frame-4213-E1481776-7638-45E2-BCCA-7DD291F1FE9C@mhtml.blink>
Content-Transfer-Encoding: quoted-printable
Content-Location: http://blog.jecrooks.com/posts/rust-on-appengine.html
<!DOCTYPE html><html><head><meta http-equiv=3D"Content-Type" content=3D"tex=
t/html; charset=3DUTF-8">
<title>Deploying a Rust App to Google App Engine</title>
=20
<link href=3D"https://fonts.googleapis.com/css?family=3DRoboto" rel=3D"st=
ylesheet" type=3D"text/css">
<link href=3D"https://fonts.googleapis.com/css?family=3DAnonymous+Pro" re=
l=3D"stylesheet" type=3D"text/css">
<link href=3D"http://blog.jecrooks.com/stylesheets/base.css" rel=3D"style=
sheet" type=3D"text/css">
<link rel=3D"stylesheet" href=3D"http://blog.jecrooks.com/stylesheets/cod=
e-highlighting/tomorrow-night-eighties.css">
<style type=3D"text/css"></style>
=20
</head>
<body>
<span class=3D"top-matter">
<a href=3D"http://blog.jecrooks.com/" id=3D"title"><h1>jecrooks.com</h1=
></a>
<ul>
<li><a href=3D"http://blog.jecrooks.com/"><h3>blog</h3></a></li>
<li><a href=3D"http://blog.jecrooks.com/games/games.html"><h3>games</=
h3></a></li>
<li><a href=3D"http://blog.jecrooks.com/about.html"><h3>about</h3></a=
></li>
</ul>
</span>
<hr>
<div id=3D"content">
<div class=3D"post">
<span class=3D"post-header">
<h2>Deploying a Rust App to Google App Engine</h2>
<h4>April 1, 2016</h4>
</span>
<div class=3D"post-body">
<p>
I love the <a href=3D"http://rust-lang.org/">Rust Language</a>.
The trade-offs Rust has chosen work really well for me.
I like static typing, powerful type systems, functional programming=
, and control over memory.
Those last two, in particular, often seem at odds with one another,=
and I really appreciate Rust's particular combination of theory and pragma=
tism.
I also like Google App Engine, and the general Google cloud ecosyst=
em.
This wasn't true originally, but the more I've learned, the more I'=
ve grown to like it.
This blog is served statically from Google Cloud Storage, and I use=
GAE to back my consulting web-apps, when I choose the stack, at any rate.
While I find many things in technology quite interesting, server ma=
intenance is not really one of them, so GAE's managed instances are perfect=
for me.
For my first real application in Rust, I'm writing the back-end to =
a Disqus-like commenting system for this blog, which I want to host on GAE.
Which means I want to run Rust apps on GAE, which is precisely what=
we'll do.
</p>
<div id=3D"read-more"></div>
<h3>Hello Rust Engine!</h3>
<p>
In this article, we'll write a simple "Hello World" web application=
in Rust using the Iron web framework and deploy it to Google App Engine.
The app itself will be trivial: Respond to any request with "Hello =
Rust Engine!"
In order to deploy to GAE, as opposed to manage-it-yourself Compute=
Engine, we have to use App Engine's Custom Runtime option, which means dep=
loying Docker images.
To complicate things just a little more, I'm doing this from OS X, =
which requires a little more dancing around to get things working right.
</p>
<p>
Let's start with getting the Rust application working by itself.
If you're reading this, you've probably already got Rust and Cargo =
installed, but if not, I suggest using <a href=3D"http://www.rustup.rs/">ru=
stup</a> to get everything set-up.
With that handled, let's start a new project.
</p><pre><code class=3D"hljs java">
$ cargo <span class=3D"hljs-keyword">new</span> hello-rust-engine -=
-bin
</code></pre>
Cargo will set-up a new project in the folder <code>hello-rust-engi=
ne</code>, complete with a hello world printing main.rs and Cargo.toml file=
.
We're going to use the <a href=3D"http://ironframework.io/">Iron fr=
amework</a> to build the web-app itself, so we'll need to add that to the d=
ependencies of the Cargo.toml file.
The file itself should look like:
<pre><code class=3D"hljs java">
[<span class=3D"hljs-keyword">package</span>]
name =3D <span class=3D"hljs-string">"hello-rust-engine"</span>
version =3D <span class=3D"hljs-string">"0.1.0"</span>
authors =3D [<span class=3D"hljs-string">"emptylist &lt;crooks1379@=
gmail.com&gt;"</span>]
[dependencies]
iron =3D <span class=3D"hljs-string">"*"</span>
</code></pre>
The <code>iron =3D "*"</code> should be all you need to add.
The app itself is modified from the 'hello world' example on the Ir=
on.io homepage, with some additional hack to get the host ip to bind the se=
rver so we're serving publicly.
Actually, solving this was the point where I realized just how bad =
my networking knowledge is.
<p></p>
<pre><code class=3D"rust hljs">
<span class=3D"hljs-keyword">extern</span> <span class=3D"hljs-keyword"=
>crate</span> iron;
<span class=3D"hljs-keyword">use</span> iron::prelude::*;
<span class=3D"hljs-keyword">use</span> iron::status;
<span class=3D"hljs-keyword">use</span> std::process::Command;
<span class=3D"hljs-keyword">use</span> std::net::SocketAddrV4;
<span class=3D"hljs-keyword">use</span> std::net::Ipv4Addr;
<span class=3D"hljs-keyword">use</span> std::<span class=3D"hljs-keywor=
d">str</span>;
<span class=3D"hljs-function"><span class=3D"hljs-keyword">fn</span> <s=
pan class=3D"hljs-title">main</span></span>() {
<span class=3D"hljs-keyword">let</span> host_port =3D <span class=3D"=
hljs-number">8080</span>; <span class=3D"hljs-comment">//Note: port must be=
8080 for GAE</span>
<span class=3D"hljs-keyword">let</span> hostname_cmd =3D Command::new=
(<span class=3D"hljs-string">"hostname"</span>).arg(<span class=3D"hljs-str=
ing">"-I"</span>).output();
<span class=3D"hljs-keyword">let</span> host_addr: SocketAddrV4 =3D <=
span class=3D"hljs-keyword">match</span> hostname_cmd {
<span class=3D"hljs-literal">Ok</span>(res) =3D&gt; {
<span class=3D"hljs-keyword">let</span> addr =3D str::from_utr8(r=
es.stdout.as_slice())
.map_err(|err| err.to_string())
.and_then(|ip_str| ip_str.trim()
.parse::&lt;Ipv4Addr&gt;()
.map_err(|err| err.to_string())
.map(|ip| SocketAddrV4::new(ip, host_port));
<span class=3D"hljs-keyword">match</span> addr {
<span class=3D"hljs-literal">Ok</span>(addr) =3D&gt; addr,
<span class=3D"hljs-literal">Err</span>(_) =3D&gt; {
<span class=3D"hljs-keyword">let</span> ip =3D Ipv4Addr::new(=
<span class=3D"hljs-number">127</span>, <span class=3D"hljs-number">0</span=
>, <span class=3D"hljs-number">0</span>, <span class=3D"hljs-number">1</spa=
n>);
SocketAddrV4::new(ip, host_port)
}
}
},
<span class=3D"hljs-literal">Err</span>(_) =3D&gt; {
<span class=3D"hljs-keyword">let</span> ip =3D Ipv4Addr::new(<spa=
n class=3D"hljs-number">127</span>, <span class=3D"hljs-number">0</span>, <=
span class=3D"hljs-number">0</span>, <span class=3D"hljs-number">1</span>);
SocketAddrV4::new(ip, host_port)
}
};
<span class=3D"hljs-built_in">println!</span>(<span class=3D"hljs-str=
ing">"Server listening at {}"</span>, host_addr);
Iron::new(|_: &amp;<span class=3D"hljs-keyword">mut</span> Request| {
<span class=3D"hljs-literal">Ok</span>(Response::with((status::<spa=
n class=3D"hljs-literal">Ok</span>, <span class=3D"hljs-string">"Hello Rust=
Engine!"</span>)))
}).http(host_addr).unwrap();
}
</code></pre>
<p>
Pretty much everything above that's different from the Iron example=
is about getting the hostname.
On (many?) Linux systems, <code>hostname -I</code> will get the hos=
t ip address, which will be the public ip to listen to if the system is a s=
erver, and the loopback address if the system is not (i.e. a desktop).
Of course, if that command fails, as it will on OS X which I'm work=
ing from, I want to grab the loopback address instead so I can test that th=
e server running.
The upshot of all of this is that Docker is going to assign a 'publ=
ic ip' to the container, and we need to grab that ip, not localhost, to ser=
ve across the container-host boundary.
There is probably a better way of getting that IP address, but the =
hostname worked, at least, and using Docker means we control the applicatio=
n's deployment context, so it should work well enough.
I'm open to better suggestions.
Finally, the listening port must be 8080 for deploying to Google Ap=
p Engine.
</p>
<p>
The rest of the code is mainly about dealing with errors, and follo=
ws pretty directly the strategy in the rust book section <a href=3D"https:/=
/doc.rust-lang.org/book/error-handling.html">on error handling</a>.
At this point, <code>cargo run</code> should compile and run the se=
rver.
Most likely, you'll see <code>Server listening at 127.0.0.1:8080</c=
ode>, and you should get a plain text page saying "Hello Rust Engine!" at t=
hat address.
With that, we're finished with the actual Rust portion; next we nee=
d to build a docker image and deploy that to GAE.
</p>
<h3>Docker</h3>
<p>
The next task is making a <a href=3D"https://www.docker.com/">Docke=
r</a> image to deploy to GAE.
My knowledge of Docker consists precisely of getting this example r=
unning, so keep that in mind for this section.
If you already know how Docker works, you can skip <a href=3D"http:=
//blog.jecrooks.com/posts/rust-on-appengine.html#rust-docker">the section o=
n running the Rust app</a>.
Obviously, you'll need to install docker first.
Following that, on OS X, you need to start up <code>docker-machine<=
/code> first, since Docker requires a Linux kernel to function.
If you're on Linux, you can skip this part, but for OS X, you'll wa=
nt to run
</p>
<pre><code class=3D"hljs javascript">
$ docker-machine create --driver virtualbox <span class=3D"hljs-key=
word">default</span>
$ <span class=3D"hljs-built_in">eval</span> $(docker-machine env <s=
pan class=3D"hljs-keyword">default</span>)
</code></pre>
<p>
The first command creates a virtual machine using virtualbox with t=
he name default.
The second line sets up the docker-machine environment variables.
An important note is that the second line needs to be re-run everyt=
ime you change Wi-Fi connections.
This threw me for a bit where Cargo was unable to access the intern=
et to pull and compile my program after I moved between Wi-Fi endpoints.
I think it's due to shifting IPs from DHCP; Docker images rely on t=
he networking information they're given when they're run, rather than askin=
g for it from the host dynamically, so after moving Wi-Fi endpoints, docker=
-machine needs to re-export the right environmental variables.
</p>
<p>
Anyway, test that everything is working,
</p><pre><code class=3D"hljs bash">
$ docker run <span class=3D"hljs-_">-d</span> -P 8000:80 nginx
</code></pre>
This will pull down a Docker image with nginx and run it.
The <code>-P 8000:80</code> flag will publish port 80 on the contai=
ner to port 8000 on the host.
However, the container will <em>not</em> be serving on localhost.
To get the ip address from docker-machine, run
<pre><code class=3D"hljs">
$ docker-machine ip
</code></pre>
In my case, this yields <code>192.168.99.100</code>, so going to <c=
ode>192.168.99.100:8000</code> in the browser will show the Nginx default p=
age.
With that, we can make a docker image for our Rust application.
<p></p>
<div id=3D"rust-docker"></div>
<h3>Running the Rust Webapp through Docker</h3>
<p>
At this point we can write a Dockerfile to deploy with.
<a href=3D"https://www.jimmycuadra.com/">Jimmy Cuadra</a> has publi=
shed a <a href=3D"https://hub.docker.com/r/jimmycuadra/rust/">Docker image<=
/a> that sets up a Rust environment with rustc, cargo, and company.
We'll use this image as a base to build the image we'll deploy to G=
AE.
In the <code>hello-rust-engine</code> directory, make a new Dockerf=
ile (called Dockerfile) containing
</p><pre><code class=3D"hljs bash">
FROM jimmycuadra/rust
EXPOSE 8080
COPY Cargo.toml /<span class=3D"hljs-built_in">source</span>
COPY src/main.rs /srouce/src/
CMD cargo run
</code></pre>
This takes the <code>jimmycuadra/rust</code> image as a base, expos=
es port 8080 on the container, copies files from the current directory to t=
he directory <code>/source</code> and finally executes the cargo run comman=
d.
By default, the base docker image makes a directory <code>/source</=
code> and enters there, which is why we're copying the files there.
Since we're just making a proof of principle, we'll use <code>cargo=
run</code> to compile and launch the application when the image starts, bu=
t in general this is not a good deployment strategy for an actual applicati=
on.
<p></p>
<p>
With that, we can build and run the docker image for the app.
</p><pre><code class=3D"hljs">
$ docker build -t hello-rust .
$ docker run -P hello-rust
</code></pre>
The first command obviously builds the image, in this case <code>-t=
hello-rust</code> names the image hello-rust, and <code>.</code> specifies=
that we're building using the current directory as the path root.
The second command runs the <code>hello-rust</code> image that we j=
ust built, publishing all of the ports that are listed by <code>EXPOSE</cod=
e> to host ports selected by Docker.
After running, you should see Cargo doing it's thing and compiling =
and running the application.
Remember that the internal IP that the images publishes is not the =
IP to visit in the browser.
In my case, the rust application tells me that the server is listen=
ing at <code>172.17.0.2:8080</code>, but we actually need the IP address an=
d port that Docker is communicating to the host on, which we can get from <=
code>docker ps</code> and <code>docker-machine ip</code>:
<pre><code class=3D"hljs vim">
$ docker-machine ip
$ docker <span class=3D"hljs-keyword">ps</span>
</code></pre>
The first command will give the ip address to check.
Again, for me, this is <code>192.168.99.100</code>.
The second will show the running docker processes; we're interested=
in the PORTS column, which should have an entry that looks like=20
<pre><code class=3D"hljs elm">
<span class=3D"hljs-number">0.0</span><span class=3D"hljs-number">.=
0</span><span class=3D"hljs-number">.0</span>:<span class=3D"hljs-number">3=
2769</span>-&gt;<span class=3D"hljs-number">8080</span>/tcp
</code></pre>
This tells us that the docker process is forwarding port 32769 of t=
he host machine to port 8080 of the docker container for tcp traffic.
The upshot is that, in my case, I want to visit <code>192.168.99.10=
0:8080</code> in the browser, or alternatively you can test with cURL.
<pre><code class=3D"hljs">
$ curl 192.168.99.100:32769
</code></pre>
I get the response back "Hello Rust Engine!" and realize I didn't e=
ven bother to finish the response with a newline.
Obviously, you'll want to substitute the ip and port your system sh=
ows from the docker commands.
At this point we're successfully running our trivial web applicatio=
n from inside a docker container.
Last step: deploy to GAE!
<p></p>
<p>
As an aside: you'll want to stop the docker process running the ima=
ge now.
To do so, use=20
</p><pre><code class=3D"hljs sql">
$ docker <span class=3D"hljs-keyword">stop</span> $<span class=3D"h=
ljs-keyword">name</span>
</code></pre>
where <code>$name</code> is the name of the process shown in the NA=
MES column when running <code>docker ps</code>.
They're random and odd - I've got one 'hopeful_dubinsky' as I write=
this section.
<h3>Deployment</h3>
<p>
Finally, we're almost there!
Our last step is deploying to Google App Engine.
If you haven't already, you'll need to <a href=3D"https://cloud.goo=
gle.com/appengine/">sign up</a> and install the <a href=3D"https://cloud.go=
ogle.com/sdk/">gcloud SDK</a>.
Follow the instructions and get everything initialized.
You'll also need to set up a project to deploy to through the web c=
onsole.
My project for this application is "hello-rust-engine", so that's t=
he name I'll be using for the rest of the article.
Substitute with your project name as appropriate.
</p>
<p>
If you haven't already while following Google's instructions, you'l=
l want to run
</p><pre><code class=3D"hljs swift">
$ gcloud <span class=3D"hljs-keyword">init</span>
</code></pre>
The interactive initialization procedure will handle set up.
If you didn't set up the 'hello-rust-engine' project as the default=
during the init process, do so now with
<pre><code class=3D"hljs sql">
$ gcloud config <span class=3D"hljs-keyword">set</span> <span class=
=3D"hljs-keyword">project</span> hello-rust-<span class=3D"hljs-keyword">en=
gine</span>
</code></pre>
Okay, that should handle the set up.
We need to make an app.yaml file to configure GAE and then we can u=
pload.
The app.yaml file should be located in the project root (so the hel=
lo-rust-engine directory), along with src and the Dockerfile, and should re=
ad
<pre><code class=3D"hljs http">
<span class=3D"hljs-attribute">runtime</span>: custom
<span class=3D"hljs-attribute">vm</span>: true
</code></pre>
This just specifies that we're using the Custom Runtime/Managed VM =
system.
There's nothing else we need to do with the YAML file for this demo=
, so let's deploy!
<pre><code class=3D"hljs">
$ gcloud preview app deploy
</code></pre>
This should deploy the docker image <code>hello-rust-engine/default=
</code> to GAE at the URL specified on your project console, in my case, th=
is is <code>https://hello-rust-engine.appspot.com</code>.
Deployment will take awhile.
Be patient.
<p></p>
<p>
Once it's live, you can test with the browser or via curl
</p><pre><code class=3D"hljs vim">
$ curl hello-rust-engine.appspot.<span class=3D"hljs-keyword">com</=
span>
</code></pre>
(But with your project URL, of course!)
And you should see
<pre><code class=3D"hljs">
Hello Rust Engine!
</code></pre>
We're done!
Rust is running on GAE.
Happy hacking!
<p></p>
</div>
</div>
</div>
<div class=3D"footer">
<small>
This <span xmlns:dct=3D"http://purl.org/dc/terms/" href=3D"http://purl.=
org/dc/dcmitype/Text" rel=3D"dct:type">work</span> is licensed under a <a r=
el=3D"license" href=3D"http://creativecommons.org/licenses/by/4.0/">Creativ=
e Commons Attribution 4.0 International License</a>.
</small>
</div>
</body></html>
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: font/woff2
Content-Transfer-Encoding: base64
Content-Location: https://fonts.gstatic.com/s/roboto/v15/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2
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
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: https://fonts.googleapis.com/css?family=Roboto
@charset "utf-8";
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/sTdaA6j0Psb920Vjv-mrzH-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+460-52F, U+20B4, U+2DE0-2DFF, U+A640-A69F; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/uYECMKoHcO9x1wdmbyHIm3-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+400-45F, U+490-491, U+4B0-4B1, U+2116; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/tnj4SB6DNbdaQnsM8CFqBX-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+1F00-1FFF; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/_VYFx-s824kXq_Ul2BHqYH-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+370-3FF; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/NJ4vxlgWwWbEsv18dAhqnn-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+102-103, U+1EA0-1EF1, U+20AB; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/Ks_cVxiCiwUWVsFWFA3Bjn-_kf6ByYO6CLYdB4HQE-Y.woff2") format("wo=
ff2"); unicode-range: U+100-24F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2=
C60-2C7F, U+A720-A7FF; }
@font-face { font-family: Roboto; font-style: normal; font-weight: 400; src=
: local("Roboto"), local("Roboto-Regular"), url("https://fonts.gstatic.com/=
s/roboto/v15/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2") format("wo=
ff2"); unicode-range: U+0-FF, U+131, U+152-153, U+2C6, U+2DA, U+2DC, U+2000=
-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; }
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: font/woff2
Content-Transfer-Encoding: base64
Content-Location: https://fonts.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E3n3cbdKJftHIk87C9ihfO8.woff2
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
AAA=
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: https://fonts.googleapis.com/css?family=Anonymous+Pro
@charset "utf-8";
@font-face { font-family: "Anonymous Pro"; font-style: normal; font-weight:=
400; src: local("Anonymous Pro"), local("AnonymousPro"), url("https://font=
s.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E7adWJUEM8B3QOikd-ElbEI=
.woff2") format("woff2"); unicode-range: U+400-45F, U+490-491, U+4B0-4B1, U=
+2116; }
@font-face { font-family: "Anonymous Pro"; font-style: normal; font-weight:=
400; src: local("Anonymous Pro"), local("AnonymousPro"), url("https://font=
s.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E2z7ZuG627hcbv-qfsWAw0c=
.woff2") format("woff2"); unicode-range: U+370-3FF; }
@font-face { font-family: "Anonymous Pro"; font-style: normal; font-weight:=
400; src: local("Anonymous Pro"), local("AnonymousPro"), url("https://font=
s.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E9ZXQWU7WlSDbWsNPOIoHjQ=
.woff2") format("woff2"); unicode-range: U+100-24F, U+1E00-1EFF, U+20A0-20A=
B, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; }
@font-face { font-family: "Anonymous Pro"; font-style: normal; font-weight:=
400; src: local("Anonymous Pro"), local("AnonymousPro"), url("https://font=
s.gstatic.com/s/anonymouspro/v8/Zhfjj_gat3waL4JSju74E3n3cbdKJftHIk87C9ihfO8=
.woff2") format("woff2"); unicode-range: U+0-FF, U+131, U+152-153, U+2C6, U=
+2DA, U+2DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U=
+F000; }
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://blog.jecrooks.com/stylesheets/base.css
@charset "utf-8";
body { font-family: Roboto, sans-serif; font-size: 140%; line-height: 1.6; =
margin-left: 10%; margin-right: 10%; margin-top: 40px; background-color: rg=
b(250, 250, 250); }
pre { width: 100%; overflow: auto; font-size: 18px; }
code { font-family: "Anonymous Pro", monospace; }
a { text-decoration-line: none; }
.top-matter { display: block; }
.top-matter ul { position: absolute; right: 10%; top: 10px; }
.top-matter li { display: inline-block; margin-left: 5px; }
.top-matter a { color: black; text-decoration-line: none; }
.top-matter a:hover { color: gold; }
#title h1 { margin-left: 5px; color: black; }
.post-header { line-height: 1; }
.post-header a { color: black; }
#content { padding-top: 20px; padding-left: 5%; padding-right: 5%; }
.footer { font-size: 80%; margin-left: 50%; transform: translateX(-50%); }
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8----
Content-Type: text/css
Content-Transfer-Encoding: quoted-printable
Content-Location: http://blog.jecrooks.com/stylesheets/code-highlighting/tomorrow-night-eighties.css
@charset "utf-8";
.hljs-comment, .hljs-quote { color: rgb(153, 153, 153); }
.hljs-variable, .hljs-template-variable, .hljs-tag, .hljs-name, .hljs-selec=
tor-id, .hljs-selector-class, .hljs-regexp, .hljs-deletion { color: rgb(242=
, 119, 122); }
.hljs-number, .hljs-built_in, .hljs-builtin-name, .hljs-literal, .hljs-type=
, .hljs-params, .hljs-meta, .hljs-link { color: rgb(249, 145, 87); }
.hljs-attribute { color: rgb(255, 204, 102); }
.hljs-string, .hljs-symbol, .hljs-bullet, .hljs-addition { color: rgb(153, =
204, 153); }
.hljs-title, .hljs-section { color: rgb(102, 153, 204); }
.hljs-keyword, .hljs-selector-tag { color: rgb(204, 153, 204); }
.hljs { display: block; overflow-x: auto; color: rgb(204, 204, 204); paddin=
g: 0.5em; background: rgb(45, 45, 45); }
.hljs-emphasis { font-style: italic; }
.hljs-strong { font-weight: bold; }
------MultipartBoundary--JS6VqEA1CaoIbspHBB61qNgbfVtHBPM813M6vK79n8------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment