Initial commit
366
15418/index.html
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ISPC++ - 15418 Final Project</title>
|
||||||
|
<link rel="stylesheet" href="style.css" type="text/css">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>ISPC++</h1>
|
||||||
|
<h2> 15418 Final Project</h2>
|
||||||
|
<p>Aaron Gutierrez <br> amgutier@andrew <br> Carnegie Mellon University</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Final Write Up</h2>
|
||||||
|
|
||||||
|
<h3>Summary</h3>
|
||||||
|
<p>ISPC++ adds support for numeric polymorphic functions to the Intel SPMD
|
||||||
|
Program Compiler. Programmers can write a single function definition and use
|
||||||
|
the same function on any appropriate numeric type.</p>
|
||||||
|
|
||||||
|
<h3>Background</h3>
|
||||||
|
<p>ISPC++ is a <a href="https://github.com/aarongut/ispc">fork</a> of the
|
||||||
|
<a href="https://ispc.github.io/ispc.html"> Intel SPMD Program Compiler
|
||||||
|
(ISPC)</a>. ISPC aims to make writing programs that take advantage
|
||||||
|
of SIMD vector instructions easy for a C or C++ programmer. Because of the
|
||||||
|
target application, most functions perform computations on numeric data.
|
||||||
|
Based off of the C language, an ISPC program must include multiple
|
||||||
|
different definitions for each appropriate datatype.</p>
|
||||||
|
|
||||||
|
<p>ISPC++ removes that burden by providing polymorphic numeric types and
|
||||||
|
automatically compiling multiple versions of functions for use with
|
||||||
|
different datatypes. The programmer now needs to only write and maintain a
|
||||||
|
single version of each function. </p>
|
||||||
|
|
||||||
|
<code><pre>
|
||||||
|
<span class="type">number</span> <span class="ident">pow</span>(<span class="type">number</span> <span class="ident">b</span>, <span class="type">int</span> <span class="ident">a</span>) {
|
||||||
|
<span class="type">number</span> <span class="ident">out</span> <span class="op">=</span> <span class="ident">b</span>;
|
||||||
|
<span class="keyword">for</span> (<span class="type">int</span> <span class="ident">i</span> <span class="op">=</span> 1; <span class="ident">i</span><span class="op"><</span><span class="ident">a</span>; <span class="ident">i</span><span class="op">++</span>) {
|
||||||
|
<span class="ident">out</span> <span class="op">*=</span> <span class="ident">b</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="keyword">return</span> <span class="ident">out</span>;
|
||||||
|
}
|
||||||
|
|
||||||
|
<span class="keyword">export</span> <span class="type">void</span> <span
|
||||||
|
class="ident">square</span>(<span class="type">uniform int</span> <span
|
||||||
|
class="ident">N</span>, <span class="type">uniform number</span> <span
|
||||||
|
class="ident">b</span>[], <span class="type">uniform number</span> <span class="ident">out</span>[]) {
|
||||||
|
<span class="keyword">foreach</span> (<span class="ident">i</span> <span class="op">=</span> 0 <span class="op">...</span> <span class="ident">N</span>) {
|
||||||
|
<span class="ident">out</span>[<span class="ident">i</span>] <span class="op">=</span> <span class="ident">pow</span>(<span class="ident">b</span>[<span class="ident">i</span>], 2);
|
||||||
|
}
|
||||||
|
}</pre>
|
||||||
|
</code>
|
||||||
|
<p class="caption">Sample function using a polymorphic helper method</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Approach</h3>
|
||||||
|
<p>Modifications to ISPC fall into two broad categories: adding support for
|
||||||
|
polymorphic type, and expanding functions with polymorphic arguments.<p>
|
||||||
|
|
||||||
|
<p>To add support for polymorphic types, I created a new type class
|
||||||
|
<kbd>PolyType</kbd>. There are three varieties: integer, floating, and
|
||||||
|
number. As with the other basic types in ISPC, we can have uniform or
|
||||||
|
varying, in addition to const, versions of each type. With the new types
|
||||||
|
added, the parser was modified to produce the new types. Finally, the new
|
||||||
|
cases produced by the new types are handled in typechecking.</p>
|
||||||
|
|
||||||
|
<p>After typechecking a function, we check for polymorphic parameters. If a
|
||||||
|
function has any polymorphic parameters, we create all of the permutations
|
||||||
|
of the function prototype. These prototypes are stored to produce the proper
|
||||||
|
header file later.</p>
|
||||||
|
|
||||||
|
<p>When adding definitions to the declarations, we traverse the abstract
|
||||||
|
syntax tree replacing the polymorphic types with the appropriate type from
|
||||||
|
the function definition. After this step is done, we are left with
|
||||||
|
overloaded functions and no polymorphic types. The rest of compilation
|
||||||
|
occurs normally.</p>
|
||||||
|
|
||||||
|
<p>When writing the final output, we add wrappers around all of the
|
||||||
|
polymorphic functions to enable convenient use from our C++ program.</p>
|
||||||
|
|
||||||
|
<p>For example, if we have a function <kbd>void foo(uniform int N, uniform
|
||||||
|
floating A[])</kbd>, we'd have the following header file:</p>
|
||||||
|
|
||||||
|
<code>
|
||||||
|
<pre><span class="comment">/* boilerplate from ISPC */</span>
|
||||||
|
<span class="keyword">extern</span> <span class="type">void</span> <span class="ident">foo_uni_un_3C_und_3E_</span>(<span class="type">int32_t</span> <span class="ident">N</span>, <span class="type">double</span> * <span class="ident">X</span>);
|
||||||
|
<span class="keyword">extern</span> <span class="type">void</span> <span class="ident">foo_uni_un_3C_unf_3E_</span>(<span class="type">int32_t</span> <span class="ident">N</span>, <span class="type">float</span> * <span class="ident">X</span>);
|
||||||
|
|
||||||
|
#if defined(__cplusplus)
|
||||||
|
<span class="keyword">extern</span> <span class="type">void</span> <span class="ident">foo</span>(<span class="type">int32_t</span> <span class="ident">N</span>, <span class="type">double</span> * <span class="ident">X</span>) {
|
||||||
|
<span class="keyword">return</span> <span class="ident">foo_uni_un_3C_und_3E_</span>(<span class="ident">N</span>, <span class="ident">X</span>);
|
||||||
|
}
|
||||||
|
<span class="keyword">extern</span> <span class="type">void</span> <span class="ident">foo</span>(<span class="type">int32_t</span> <span class="ident">N</span>, <span class="type">float</span> * <span class="ident">X</span>) {
|
||||||
|
<span class="keyword">return</span> <span class="ident">foo_uni_un_3C_unf_3E_</span>(<span class="ident">N</span>, <span class="ident">X</span>);
|
||||||
|
}
|
||||||
|
#endif <span class="comment">// __cplusplus</span>
|
||||||
|
<span class="comment">/* more boilerplate */</span>
|
||||||
|
</pre></code>
|
||||||
|
<p class="caption">Example header file showing overloaded polymorphic
|
||||||
|
function <kbd>foo</kbd></p>
|
||||||
|
|
||||||
|
<h3>Language Specification</h3>
|
||||||
|
<p>Most of the language is unchanged from ISPC. The specification can be
|
||||||
|
found in the ISPC <a
|
||||||
|
href="https://ispc.github.io/ispc.html#the-ispc-language">documentation</a>.</p>
|
||||||
|
|
||||||
|
<p>The only change is the 3 new types. The semantics follow if you treat the
|
||||||
|
types as their representative atomic types.</p>
|
||||||
|
<code>
|
||||||
|
<pre><type> := <variability> <typename><quant>;
|
||||||
|
| <span class="comment">/* all the other ISPC types</span>
|
||||||
|
;
|
||||||
|
<variability> := <span class="ident">uniform</span>
|
||||||
|
| <span class="ident">varying</span>
|
||||||
|
| <span class="comment">/* empty, varying */</span>
|
||||||
|
;
|
||||||
|
<typename> := <span class="ident">integer</span>
|
||||||
|
| <span class="ident">floating</span>
|
||||||
|
| <span class="ident">number</span>
|
||||||
|
;
|
||||||
|
<quant> := <span class="ident">$</span>[0-9]+
|
||||||
|
| <span class="comment">/* empty, default quantifier */</span>
|
||||||
|
;</pre>
|
||||||
|
</code>
|
||||||
|
<p class="caption">Specification for an ISPC++ type</p>
|
||||||
|
|
||||||
|
<p><kbd>integer</kbd> is expanded to all of the integer types (signed and
|
||||||
|
unsigned, 8, 16, 32, and 64 bits). <kbd>floating</kbd> is expanded to both
|
||||||
|
<kbd>float</kbd> and <kbd>double</kbd>. <kbd>number</kbd> is expanded to the
|
||||||
|
union of the set of types for <kbd>integer</kbd> and
|
||||||
|
<kbd>floating</kbd>.</p>
|
||||||
|
|
||||||
|
<p>The quantifier is used to distinguish independent polymorphic types. If
|
||||||
|
no quantifier is specified, all similar types are considered identical.
|
||||||
|
Otherwise, types with different quantifiers are expanded independently. The
|
||||||
|
syntax for quantifiers has changed since the start of my project to avoid
|
||||||
|
conflict with vector types.</p>
|
||||||
|
|
||||||
|
<p>In the saxpy function bellow, we use type quantifiers to specify that the
|
||||||
|
input types can vary independent of the output type.</p>
|
||||||
|
|
||||||
|
<code>
|
||||||
|
<pre><span class="keyword">export</span> <span class="type">void</span> <span class="ident">saxpy</span>(<span class="keyword">uniform</span> <span class="keyword">int</span> <span class="ident">N</span>,
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating$0</span> <span class="ident">scale</span>,
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating$1</span> <span class="ident">X</span>[],
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating$1</span> <span class="ident">Y</span>[],
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating$2</span> <span class="ident">result</span>[])
|
||||||
|
{
|
||||||
|
<span class="keyword">foreach</span> (<span class="ident">i</span> <span class="op">=</span> 0 <span class="op">...</span> <span class="ident">N</span>) {
|
||||||
|
<span class="type">floating$2</span> <span class="ident">tmp</span> <span class="op">=</span> <span class="ident">scale</span> <span class="op">*</span> <span class="ident">X</span>[<span class="ident">i</span>] <span class="op">+</span> <span class="ident">Y</span>[<span class="ident">i</span>];
|
||||||
|
<span class="ident">result</span>[<span class="ident">i</span>] <span class="op">=</span> <span class="ident">tmp</span>;
|
||||||
|
}
|
||||||
|
}</pre>
|
||||||
|
</code>
|
||||||
|
<p class="caption">Example <kbd>saxpy</kbd> program showing quantified
|
||||||
|
polymorphic types</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p>A function may only return a polymorphic type if that type appears in the
|
||||||
|
parameters. Any polymorphic type found in a function body not found in the
|
||||||
|
parameters is cause for a typechecking error.</p>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>Results</h3>
|
||||||
|
<p>At present, my compiler works as intended on all of my test cases.</p>
|
||||||
|
|
||||||
|
<h4>Maintain full compatibility with the ISPC language</h4>
|
||||||
|
<p>To my first goal of maintaining compatibility with ISPC, out of 1330 test
|
||||||
|
cases, I fail 1 due to a variable named <kbd>number</kbd> which is now the
|
||||||
|
name of a type, and then 3 others that involve an implicit struct
|
||||||
|
definition, which I'll accept as minimally disruptive.</p>
|
||||||
|
|
||||||
|
<h4>Produce C and C++ compatible object code</h4>
|
||||||
|
<p>Compatibility with C++ is excellent: the produced header file defines a
|
||||||
|
single overloaded function for each exported polymorphic function that can
|
||||||
|
be used from the namespace <kbd>ispc</kbd>.</p>
|
||||||
|
<p>Compatibility with C is worse, but functional. Each version of a
|
||||||
|
polymorphic function is exported, but with a mangled name. Given that C does
|
||||||
|
not support polymorphic functions, this is as best as we can hope to do, but
|
||||||
|
working in C++ should be greatly preferred.</p>
|
||||||
|
|
||||||
|
<h4>Produce performant, vectorized versions of polymorphic functions</h4>
|
||||||
|
<p>Given that the backend of the compiler is not modified, the resulting
|
||||||
|
object file should be identical to non-polymorphic code. I do not have
|
||||||
|
extensive benchmarks, as I assumed performance would not be an issue, but
|
||||||
|
from my testing performance is not a concern.</p>
|
||||||
|
|
||||||
|
<p>Within ISPC, polymorphic functions are supported natively through
|
||||||
|
function overloading, including with concurrency through the
|
||||||
|
<kbd>launch</kbd> semantic.</p>
|
||||||
|
|
||||||
|
<h3>Conclusion</h3>
|
||||||
|
<p>Overall, I would consider ISPC++ a success. Aside from the issues with
|
||||||
|
implicitly defined structs, my finished product matches my vision coming
|
||||||
|
into this project and from my proposal.</p>
|
||||||
|
|
||||||
|
<p>We are able to easily make some academic observations using the new
|
||||||
|
functionality. For example, I modified our square root function from the
|
||||||
|
first assignment to observe single vs. double precision performance.</p>
|
||||||
|
<code><pre>[sqrt float serial]: [779.727] ms
|
||||||
|
[sqrt double serial]: [785.532] ms
|
||||||
|
[sqrt float ispc]: [117.996] ms
|
||||||
|
[sqrt double ispc]: [270.264] ms
|
||||||
|
[sqrt float task ispc]: [27.195] ms
|
||||||
|
[sqrt double task ispc]: [56.185] ms
|
||||||
|
(6.61x speedup from ISPC float)
|
||||||
|
(2.91x speedup from ISPC double)
|
||||||
|
(28.67x speedup from task ISPC float)
|
||||||
|
(13.98x speedup from task ISPC double)</pre>
|
||||||
|
</code>
|
||||||
|
<p class="caption">Newton's square root algorithm with single and double
|
||||||
|
precision values on an Intel Xeon E5-1660 v4 @ 3.20GHz</p>
|
||||||
|
|
||||||
|
<p>We can see that the speedup from vectorization is much lower with
|
||||||
|
doubles, while the speedup from tasks is comparable regardless of type. I
|
||||||
|
was able to run this test without duplicating any ISPC code. This conclusion
|
||||||
|
isn't surprising, given that we operate on half as many values when we
|
||||||
|
double the precision, but as a curious student, I can try any datatype or
|
||||||
|
modify the function without duplicating definitions.</p>
|
||||||
|
|
||||||
|
<p>In the same way ISPC enables a programmer to easily produce programs that
|
||||||
|
take advantage of modern CPU's, ISPC++ furthers that mission by reducing
|
||||||
|
code duplication. The easier it is for programmers to write high performance
|
||||||
|
code, the more programmers will write high performance code.</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Project Checkpoint</h2>
|
||||||
|
|
||||||
|
<h3>Work Completed</h3>
|
||||||
|
<p>I have a proof of concept implementation working. Using aggressive
|
||||||
|
textual replacement, it produces valid ISPC, with a different function for
|
||||||
|
each combination of polymorphic types.</p>
|
||||||
|
|
||||||
|
<code>
|
||||||
|
<pre><span class="keyword">export</span> <span class="type">void</span> <span class="ident">saxpy</span>(<span class="keyword">uniform</span> <span class="keyword">int</span> <span class="ident">N</span>,
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating<0></span> <span class="ident">scale</span>,
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating<1></span> <span class="ident">X</span>[],
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating<1></span> <span class="ident">Y</span>[],
|
||||||
|
<span class="keyword">uniform</span> <span class="type">floating<2></span> <span class="ident">result</span>[])
|
||||||
|
{
|
||||||
|
<span class="keyword">foreach</span> (<span class="ident">i</span> <span class="op">=</span> 0 <span class="op">...</span> <span class="ident">N</span>) {
|
||||||
|
<span class="type">floating<2></span> <span class="ident">tmp</span> <span class="op">=</span> <span class="ident">scale</span> <span class="op">*</span> <span class="ident">X</span>[<span class="ident">i</span>] <span class="op">+</span> <span class="ident">Y</span>[<span class="ident">i</span>];
|
||||||
|
<span class="ident">result</span>[<span class="ident">i</span>] <span class="op">=</span> <span class="ident">tmp</span>;
|
||||||
|
}
|
||||||
|
}</pre>
|
||||||
|
</code>
|
||||||
|
|
||||||
|
<p>This simple SAXPY program produces a header file with multiple overloaded
|
||||||
|
definitions for the saxpy function. From the example, you can see the syntax
|
||||||
|
used for polymorphic types: <samp>floating<0></samp> represents an
|
||||||
|
arbitrary floating point type, where the number is used to differentiate
|
||||||
|
independent polymorphic types. The only polymorphic types allowed are
|
||||||
|
<samp>floating</samp>, <samp>integer</samp>, and <samp>number</samp>. This
|
||||||
|
restriction solves one of the more complicated issues with separate
|
||||||
|
compilation of polymorphic code: we always generate all permutations of
|
||||||
|
polymorphic functions. We end up with an exponential blow up in code size,
|
||||||
|
but practical functions will likely only have a few polymorphic
|
||||||
|
parameters.</p>
|
||||||
|
|
||||||
|
<h3>Upcoming Work</h3>
|
||||||
|
<p>The next big step will be to modify the ISPC parser and elaboration
|
||||||
|
phases. My goals are largely unchanged, and I feel on track to produce a
|
||||||
|
complete, working solution:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Maintain full compatibility with the ISPC language</li>
|
||||||
|
<li>Produce C and C++ compatible object code</li>
|
||||||
|
<li>Produce performant, vectorized versions of polymorphic functions</li>
|
||||||
|
<li>Integrate support for polymorphic functions into ISPC</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Updated Schedule</h3>
|
||||||
|
<p>Due to illness and a realization that a preprocessor based implementation
|
||||||
|
would result in redundant work, I am no longer aiming to produce a complete
|
||||||
|
preprocessor based solution.</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>April 15: implement a proof of concept, regex based preprocessor and
|
||||||
|
any needed runtime</li>
|
||||||
|
<li>April 19: modify the ISPC backend to generate the correct header files
|
||||||
|
for both C++ and C use.</li>
|
||||||
|
<li><del>April 25: complete a preprocessor based implementation</del></li>
|
||||||
|
<li>April 29: mostly-complete code generation implementation integrated
|
||||||
|
into ISPC</li>
|
||||||
|
<li>May 3: typechecking and parsing completed</li>
|
||||||
|
<li>May 6: final implementation completed</li>
|
||||||
|
<li>May 12: all documentation and analysis completed</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section>
|
||||||
|
<h2>Proposal</h2>
|
||||||
|
|
||||||
|
<p>ISPC++ is a <a href="https://github.com/aarongut/ispc">fork</a> of the <a
|
||||||
|
href="https://ispc.github.io/ispc.html"> Intel SPMD Program Compiler
|
||||||
|
(ISPC)</a> project that includes support of polymorphic datatypes and
|
||||||
|
functions.</p>
|
||||||
|
|
||||||
|
<h3>Background</h3>
|
||||||
|
<p>ISPC aims to make writing single program multiple data (SPMD) programs
|
||||||
|
easy and relatively target-agnostic. The programmer does not need to write
|
||||||
|
vector intrinsics for each target platform, but can still closely reason
|
||||||
|
about a programs' mapping to hardware. The language closely resembles C, and
|
||||||
|
produces object files compatible with conventional C or C++ programs.</p>
|
||||||
|
|
||||||
|
<p>With roots in C, ISPC faces the same limitation to code reuse as C; in
|
||||||
|
particular, both languages lack polymorphism. Given that ISPC functions are
|
||||||
|
primarily arithmetic in nature, adding polymorphism will enable programmers
|
||||||
|
to write a single procedure and use it with any vector-supported datatype. A
|
||||||
|
single function definition can be used with different sized datatypes or
|
||||||
|
even both floating point and integer versions.</p>
|
||||||
|
|
||||||
|
<p>Similarly to how ISPC frees the programmer from re-writing functions
|
||||||
|
using different versions of intrinsics, ISPC++ will extend the abstraction to
|
||||||
|
include different operands.</p>
|
||||||
|
|
||||||
|
<h3>Problem</h3>
|
||||||
|
<p>The root of the challenge stems from maintaining compatibility with ISPC
|
||||||
|
and with C or C++. ISPC is a large application with support for a wide range
|
||||||
|
of targets, and a successful project will not inhibit that flexibility.</p>
|
||||||
|
|
||||||
|
<h3>Resources</h3>
|
||||||
|
<p>This is a direct fork of the ISPC project. Hopefully, ISPC++ will share
|
||||||
|
the same compatibility as ISPC, able to run across platforms and with any
|
||||||
|
number of vector targets.</p>
|
||||||
|
|
||||||
|
<h3>Goals</h3>
|
||||||
|
<p>This project aims to</p>
|
||||||
|
<ul>
|
||||||
|
<li>Maintain full compatibility with the ISPC language</li>
|
||||||
|
<li>Produce C and C++ compatible object code</li>
|
||||||
|
<li>Produce performant, vectorized versions of polymorphic functions</li>
|
||||||
|
</ul>
|
||||||
|
<p>and hopefully fully supports</p>
|
||||||
|
<ul>
|
||||||
|
<li>Add support for polymorphic functions somewhat similar to C++ via a
|
||||||
|
preprocessor pass</li>
|
||||||
|
<li>Integrate support for polymorphic functions into ISPC</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>Assessment</h3>
|
||||||
|
<p>The first three goals are pretty hard requirements. For the last two
|
||||||
|
there is some ability to have partial success. This project will be
|
||||||
|
completely successful if a programmer can write a single ISPC++ function and
|
||||||
|
use that function with any appropriate datatypes via overloading in C++. Any
|
||||||
|
restrictions placed on expressiveness should be avoided. For example, if the
|
||||||
|
solution makes use of regular expressions rather than integrating with the
|
||||||
|
AST, I would consider the project only a partial success.</p>
|
||||||
|
|
||||||
|
<h3>Schedule</h3>
|
||||||
|
<ul>
|
||||||
|
<li>April 15: implement a proof of concept, regex based preprocessor and
|
||||||
|
any needed runtime</li>
|
||||||
|
<li>April 19: modify the ISPC backend to generate the correct header files
|
||||||
|
for both C++ and C use.</li>
|
||||||
|
<li>April 25: complete a preprocessor based implementation</li>
|
||||||
|
<li>April 29: incomplete implementation integrated into ISPC</li>
|
||||||
|
<li>May 6: final implementation completed</li>
|
||||||
|
<li>May 12: all documentation and analysis completed</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
104
15418/style.css
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
body {
|
||||||
|
font-family: sans-serif;
|
||||||
|
background-color: #484848;
|
||||||
|
color: #989898;
|
||||||
|
padding: 24pt;
|
||||||
|
max-width: 800px;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-weight: lighter;
|
||||||
|
line-height: 150%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 24pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 16pt;
|
||||||
|
color: #ae4c00;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 12pt;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #259089;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 12pt;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
line-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
p, ul {
|
||||||
|
font-size: 10pt;
|
||||||
|
line-height: 12pt;
|
||||||
|
color: #b8b8b8;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.caption {
|
||||||
|
margin-top: 2pt;
|
||||||
|
margin-bottom: 12pt;
|
||||||
|
margin-left: 12pt;
|
||||||
|
margin-right: 12pt;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: #7878c8;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
body > * {
|
||||||
|
border-bottom: 1px solid #989898;
|
||||||
|
}
|
||||||
|
|
||||||
|
code {
|
||||||
|
background: #b8b8b8;
|
||||||
|
width: auto;
|
||||||
|
display: block;
|
||||||
|
padding: 10pt;
|
||||||
|
color: #222;
|
||||||
|
font-family: monospace;
|
||||||
|
overflow-x: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
code > pre {
|
||||||
|
margin: 0;
|
||||||
|
line-height: 125%;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .keyword {
|
||||||
|
color: #204a87;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .ident {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .op {
|
||||||
|
color: #208787;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .comment {
|
||||||
|
color: #20874a;
|
||||||
|
}
|
||||||
|
|
||||||
|
code .type {
|
||||||
|
color: #ae4c00;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
13
bench.sh
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set +x
|
||||||
|
|
||||||
|
for FILE in img/bench/webp-src/*.jpg; do
|
||||||
|
OUT="${FILE%.*}.webp"
|
||||||
|
OUT2X="${FILE%.*}@2x.webp"
|
||||||
|
cwebp -mt -resize 160 0 -q 40 $FILE -o $OUT
|
||||||
|
cwebp -mt -q 40 $FILE -o $OUT2X
|
||||||
|
done
|
||||||
|
|
||||||
|
mv img/bench/webp-src/*.webp img/bench/
|
||||||
52
bench/1.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Bench - Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="/site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Bench.</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<p>Towards the start of my time at Carnegie Mellon, I started taking
|
||||||
|
pictures of benches. It provided me an object to seek out; and seek
|
||||||
|
benches out I did. Since then, I've amassed a collection of photographs
|
||||||
|
from all over the world.</p>
|
||||||
|
|
||||||
|
<p>All images <a href="https://creativecommons.org/licenses/by-nc/4.0/">
|
||||||
|
CC BY-NC</a> Aaron Gutierrez.</p>
|
||||||
|
|
||||||
|
<div class="img-grid">
|
||||||
|
<a href="/img/bench/001.jpg"><picture><source type="image/webp" srcset="/img/bench/001.thumb.webp, /img/bench/001.thumb@2x.webp 2x"><img src="/img/bench/001.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/002.jpg"><picture><source type="image/webp" srcset="/img/bench/002.thumb.webp, /img/bench/002.thumb@2x.webp 2x"><img src="/img/bench/002.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/003.jpg"><picture><source type="image/webp" srcset="/img/bench/003.thumb.webp, /img/bench/003.thumb@2x.webp 2x"><img src="/img/bench/003.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/004.jpg"><picture><source type="image/webp" srcset="/img/bench/004.thumb.webp, /img/bench/004.thumb@2x.webp 2x"><img src="/img/bench/004.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/005.jpg"><picture><source type="image/webp" srcset="/img/bench/005.thumb.webp, /img/bench/005.thumb@2x.webp 2x"><img src="/img/bench/005.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/006.jpg"><picture><source type="image/webp" srcset="/img/bench/006.thumb.webp, /img/bench/006.thumb@2x.webp 2x"><img src="/img/bench/006.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/007.jpg"><picture><source type="image/webp" srcset="/img/bench/007.thumb.webp, /img/bench/007.thumb@2x.webp 2x"><img src="/img/bench/007.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/008.jpg"><picture><source type="image/webp" srcset="/img/bench/008.thumb.webp, /img/bench/008.thumb@2x.webp 2x"><img src="/img/bench/008.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/009.jpg"><picture><source type="image/webp" srcset="/img/bench/009.thumb.webp, /img/bench/009.thumb@2x.webp 2x"><img src="/img/bench/009.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/010.jpg"><picture><source type="image/webp" srcset="/img/bench/010.thumb.webp, /img/bench/010.thumb@2x.webp 2x"><img src="/img/bench/010.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/011.jpg"><picture><source type="image/webp" srcset="/img/bench/011.thumb.webp, /img/bench/011.thumb@2x.webp 2x"><img src="/img/bench/011.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/012.jpg"><picture><source type="image/webp" srcset="/img/bench/012.thumb.webp, /img/bench/012.thumb@2x.webp 2x"><img src="/img/bench/012.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/013.jpg"><picture><source type="image/webp" srcset="/img/bench/013.thumb.webp, /img/bench/013.thumb@2x.webp 2x"><img src="/img/bench/013.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/014.jpg"><picture><source type="image/webp" srcset="/img/bench/014.thumb.webp, /img/bench/014.thumb@2x.webp 2x"><img src="/img/bench/014.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/015.jpg"><picture><source type="image/webp" srcset="/img/bench/015.thumb.webp, /img/bench/015.thumb@2x.webp 2x"><img src="/img/bench/015.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/016.jpg"><picture><source type="image/webp" srcset="/img/bench/016.thumb.webp, /img/bench/016.thumb@2x.webp 2x"><img src="/img/bench/016.thumb.jpg"></picture></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<a href="#">Prev</a>
|
||||||
|
<a href="/">Home</a>
|
||||||
|
<a href="/bench/2.html">Next</a>
|
||||||
|
</nav>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="/">www.aarongutierrez.com</a>
|
||||||
|
<a href="/">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
52
bench/2.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Bench - Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="/site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Bench.</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<p>Towards the start of my time at Carnegie Mellon, I started taking
|
||||||
|
pictures of benches. It provided me an object to seek out; and seek
|
||||||
|
benches out I did. Since then, I've amassed a collection of photographs
|
||||||
|
from all over the world.</p>
|
||||||
|
|
||||||
|
<p>All images <a href="https://creativecommons.org/licenses/by-nc/4.0/">
|
||||||
|
CC BY-NC</a> Aaron Gutierrez.</p>
|
||||||
|
|
||||||
|
<div class="img-grid">
|
||||||
|
<a href="/img/bench/017.jpg"><picture><source type="image/webp" srcset="/img/bench/017.thumb.webp, /img/bench/017.thumb@2x.webp 2x"><img src="/img/bench/017.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/018.jpg"><picture><source type="image/webp" srcset="/img/bench/018.thumb.webp, /img/bench/018.thumb@2x.webp 2x"><img src="/img/bench/018.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/019.jpg"><picture><source type="image/webp" srcset="/img/bench/019.thumb.webp, /img/bench/019.thumb@2x.webp 2x"><img src="/img/bench/019.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/020.jpg"><picture><source type="image/webp" srcset="/img/bench/020.thumb.webp, /img/bench/020.thumb@2x.webp 2x"><img src="/img/bench/020.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/021.jpg"><picture><source type="image/webp" srcset="/img/bench/021.thumb.webp, /img/bench/021.thumb@2x.webp 2x"><img src="/img/bench/021.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/022.jpg"><picture><source type="image/webp" srcset="/img/bench/022.thumb.webp, /img/bench/022.thumb@2x.webp 2x"><img src="/img/bench/022.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/023.jpg"><picture><source type="image/webp" srcset="/img/bench/023.thumb.webp, /img/bench/023.thumb@2x.webp 2x"><img src="/img/bench/023.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/024.jpg"><picture><source type="image/webp" srcset="/img/bench/024.thumb.webp, /img/bench/024.thumb@2x.webp 2x"><img src="/img/bench/024.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/025.jpg"><picture><source type="image/webp" srcset="/img/bench/025.thumb.webp, /img/bench/025.thumb@2x.webp 2x"><img src="/img/bench/025.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/026.jpg"><picture><source type="image/webp" srcset="/img/bench/026.thumb.webp, /img/bench/026.thumb@2x.webp 2x"><img src="/img/bench/026.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/027.jpg"><picture><source type="image/webp" srcset="/img/bench/027.thumb.webp, /img/bench/027.thumb@2x.webp 2x"><img src="/img/bench/027.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/028.jpg"><picture><source type="image/webp" srcset="/img/bench/028.thumb.webp, /img/bench/028.thumb@2x.webp 2x"><img src="/img/bench/028.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/029.jpg"><picture><source type="image/webp" srcset="/img/bench/029.thumb.webp, /img/bench/029.thumb@2x.webp 2x"><img src="/img/bench/029.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/030.jpg"><picture><source type="image/webp" srcset="/img/bench/030.thumb.webp, /img/bench/030.thumb@2x.webp 2x"><img src="/img/bench/030.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/031.jpg"><picture><source type="image/webp" srcset="/img/bench/031.thumb.webp, /img/bench/031.thumb@2x.webp 2x"><img src="/img/bench/031.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/032.jpg"><picture><source type="image/webp" srcset="/img/bench/032.thumb.webp, /img/bench/032.thumb@2x.webp 2x"><img src="/img/bench/032.thumb.jpg"></picture></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<a href="/bench/1.html">Prev</a>
|
||||||
|
<a href="/">Home</a>
|
||||||
|
<a href="/bench/3.html">Next</a>
|
||||||
|
</nav>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="/">www.aarongutierrez.com</a>
|
||||||
|
<a href="/">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
52
bench/3.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Bench - Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="/site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Bench.</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<p>Towards the start of my time at Carnegie Mellon, I started taking
|
||||||
|
pictures of benches. It provided me an object to seek out; and seek
|
||||||
|
benches out I did. Since then, I've amassed a collection of photographs
|
||||||
|
from all over the world.</p>
|
||||||
|
|
||||||
|
<p>All images <a href="https://creativecommons.org/licenses/by-nc/4.0/">
|
||||||
|
CC BY-NC</a> Aaron Gutierrez.</p>
|
||||||
|
|
||||||
|
<div class="img-grid">
|
||||||
|
<a href="/img/bench/033.jpg"><picture><source type="image/webp" srcset="/img/bench/033.thumb.webp, /img/bench/033.thumb@2x.webp 2x"><img src="/img/bench/033.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/034.jpg"><picture><source type="image/webp" srcset="/img/bench/034.thumb.webp, /img/bench/034.thumb@2x.webp 2x"><img src="/img/bench/034.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/035.jpg"><picture><source type="image/webp" srcset="/img/bench/035.thumb.webp, /img/bench/035.thumb@2x.webp 2x"><img src="/img/bench/035.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/036.jpg"><picture><source type="image/webp" srcset="/img/bench/036.thumb.webp, /img/bench/036.thumb@2x.webp 2x"><img src="/img/bench/036.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/037.jpg"><picture><source type="image/webp" srcset="/img/bench/037.thumb.webp, /img/bench/037.thumb@2x.webp 2x"><img src="/img/bench/037.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/038.jpg"><picture><source type="image/webp" srcset="/img/bench/038.thumb.webp, /img/bench/038.thumb@2x.webp 2x"><img src="/img/bench/038.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/039.jpg"><picture><source type="image/webp" srcset="/img/bench/039.thumb.webp, /img/bench/039.thumb@2x.webp 2x"><img src="/img/bench/039.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/040.jpg"><picture><source type="image/webp" srcset="/img/bench/040.thumb.webp, /img/bench/040.thumb@2x.webp 2x"><img src="/img/bench/040.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/041.jpg"><picture><source type="image/webp" srcset="/img/bench/041.thumb.webp, /img/bench/041.thumb@2x.webp 2x"><img src="/img/bench/041.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/042.jpg"><picture><source type="image/webp" srcset="/img/bench/042.thumb.webp, /img/bench/042.thumb@2x.webp 2x"><img src="/img/bench/042.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/043.jpg"><picture><source type="image/webp" srcset="/img/bench/043.thumb.webp, /img/bench/043.thumb@2x.webp 2x"><img src="/img/bench/043.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/044.jpg"><picture><source type="image/webp" srcset="/img/bench/044.thumb.webp, /img/bench/044.thumb@2x.webp 2x"><img src="/img/bench/044.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/045.jpg"><picture><source type="image/webp" srcset="/img/bench/045.thumb.webp, /img/bench/045.thumb@2x.webp 2x"><img src="/img/bench/045.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/046.jpg"><picture><source type="image/webp" srcset="/img/bench/046.thumb.webp, /img/bench/046.thumb@2x.webp 2x"><img src="/img/bench/046.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/047.jpg"><picture><source type="image/webp" srcset="/img/bench/047.thumb.webp, /img/bench/047.thumb@2x.webp 2x"><img src="/img/bench/047.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/048.jpg"><picture><source type="image/webp" srcset="/img/bench/048.thumb.webp, /img/bench/048.thumb@2x.webp 2x"><img src="/img/bench/048.thumb.jpg"></picture></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<a href="/bench/2.html">Prev</a>
|
||||||
|
<a href="/">Home</a>
|
||||||
|
<a href="/bench/4.html">Next</a>
|
||||||
|
</nav>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="/">www.aarongutierrez.com</a>
|
||||||
|
<a href="/">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
52
bench/4.html
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<base href="http://www.aarongutierrez.com.s3.amazonaws.com">
|
||||||
|
<title>Bench - Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="/site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Bench.</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<p>Towards the start of my time at Carnegie Mellon, I started taking
|
||||||
|
pictures of benches. It provided me an object to seek out; and seek
|
||||||
|
benches out I did. Since then, I've amassed a collection of photographs
|
||||||
|
from all over the world.</p>
|
||||||
|
|
||||||
|
<p>All images <a href="https://creativecommons.org/licenses/by-nc/4.0/">
|
||||||
|
CC BY-NC</a> Aaron Gutierrez.</p>
|
||||||
|
|
||||||
|
<div class="img-grid">
|
||||||
|
<a href="/img/bench/049.jpg"><picture><source type="image/webp" srcset="/img/bench/049.thumb.webp, /img/bench/049.thumb@2x.webp 2x"><img src="/img/bench/049.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/050.jpg"><picture><source type="image/webp" srcset="/img/bench/050.thumb.webp, /img/bench/050.thumb@2x.webp 2x"><img src="/img/bench/050.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/051.jpg"><picture><source type="image/webp" srcset="/img/bench/051.thumb.webp, /img/bench/051.thumb@2x.webp 2x"><img src="/img/bench/051.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/052.jpg"><picture><source type="image/webp" srcset="/img/bench/052.thumb.webp, /img/bench/052.thumb@2x.webp 2x"><img src="/img/bench/052.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/053.jpg"><picture><source type="image/webp" srcset="/img/bench/053.thumb.webp, /img/bench/053.thumb@2x.webp 2x"><img src="/img/bench/053.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/054.jpg"><picture><source type="image/webp" srcset="/img/bench/054.thumb.webp, /img/bench/054.thumb@2x.webp 2x"><img src="/img/bench/054.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/055.jpg"><picture><source type="image/webp" srcset="/img/bench/055.thumb.webp, /img/bench/055.thumb@2x.webp 2x"><img src="/img/bench/055.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/056.jpg"><picture><source type="image/webp" srcset="/img/bench/056.thumb.webp, /img/bench/056.thumb@2x.webp 2x"><img src="/img/bench/056.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/057.jpg"><picture><source type="image/webp" srcset="/img/bench/057.thumb.webp, /img/bench/057.thumb@2x.webp 2x"><img src="/img/bench/057.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/058.jpg"><picture><source type="image/webp" srcset="/img/bench/058.thumb.webp, /img/bench/058.thumb@2x.webp 2x"><img src="/img/bench/058.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/059.jpg"><picture><source type="image/webp" srcset="/img/bench/059.thumb.webp, /img/bench/059.thumb@2x.webp 2x"><img src="/img/bench/059.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/060.jpg"><picture><source type="image/webp" srcset="/img/bench/060.thumb.webp, /img/bench/060.thumb@2x.webp 2x"><img src="/img/bench/060.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/061.jpg"><picture><source type="image/webp" srcset="/img/bench/061.thumb.webp, /img/bench/061.thumb@2x.webp 2x"><img src="/img/bench/061.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/062.jpg"><picture><source type="image/webp" srcset="/img/bench/062.thumb.webp, /img/bench/062.thumb@2x.webp 2x"><img src="/img/bench/062.thumb.jpg"></picture></a>
|
||||||
|
<a href="/img/bench/063.jpg"><picture><source type="image/webp" srcset="/img/bench/063.thumb.webp, /img/bench/063.thumb@2x.webp 2x"><img src="/img/bench/063.thumb.jpg"></picture></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<a href="/bench/3.html">Prev</a>
|
||||||
|
<a href="/">Home</a>
|
||||||
|
<a href="#">Next</a>
|
||||||
|
</nav>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="/">www.aarongutierrez.com</a>
|
||||||
|
<a href="/">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
36
bench_template.html
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Bench - Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="/site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Bench.</h1>
|
||||||
|
</header>
|
||||||
|
<main>
|
||||||
|
<p>Towards the start of my time at Carnegie Mellon, I started taking
|
||||||
|
pictures of benches. It provided me an object to seek out; and seek
|
||||||
|
benches out I did. Since then, I've amassed a collection of photographs
|
||||||
|
from all over the world.</p>
|
||||||
|
|
||||||
|
<p>All images <a href="https://creativecommons.org/licenses/by-nc/4.0/">
|
||||||
|
CC BY-NC</a> Aaron Gutierrez.</p>
|
||||||
|
|
||||||
|
<div class="img-grid">
|
||||||
|
{0}
|
||||||
|
</div>
|
||||||
|
<div class="nav">
|
||||||
|
<a href="{1}">Prev</a>
|
||||||
|
<a href="/">Home</a>
|
||||||
|
<a href="{2}">Next</a>
|
||||||
|
</nav>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="https://wwww.aarongutierrez.com">www.aarongutierrez.com</a>
|
||||||
|
<a href="https://www.frat.tech">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
campaign/aaron.jpg
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
campaign/banner.jpg
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
campaign/bettina.jpg
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
campaign/care.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
campaign/contact.jpg
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
campaign/cover.jpg
Normal file
|
After Width: | Height: | Size: 86 KiB |
BIN
campaign/favicon.png
Normal file
|
After Width: | Height: | Size: 529 B |
BIN
campaign/frame.png
Normal file
|
After Width: | Height: | Size: 24 KiB |
BIN
campaign/icon0.png
Normal file
|
After Width: | Height: | Size: 9.8 KiB |
BIN
campaign/icon1.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
campaign/icon2.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
203
campaign/index.html
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Vaasavi and Aaron 2016</title>
|
||||||
|
<script src="https://use.typekit.net/bdx7ivv.js"></script>
|
||||||
|
<script>try{Typekit.load({ async: true });}catch(e){}</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="site.css" >
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<div class="mobile">
|
||||||
|
<img src="logo.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<nav class="desktop">
|
||||||
|
<img src="logo.png">
|
||||||
|
<ul class="clearfix">
|
||||||
|
<li><a href="#contact">Contact</a></li>
|
||||||
|
<li><a href="photo.html">Picture Creator</a></li>
|
||||||
|
<li><a href="#team">Team</a></li>
|
||||||
|
<li><a href="#platform">Platform</a></li>
|
||||||
|
<li><a href="#about">About</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<img src="cover.jpg">
|
||||||
|
|
||||||
|
<h2 id="about">Who we are</h2>
|
||||||
|
|
||||||
|
<div class="clearfix">
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="vaas.jpg">
|
||||||
|
Vaasavi is a third year studying Economics at Carnegie Mellon
|
||||||
|
University. She has been involved in the Student Senate, Student Life,
|
||||||
|
Moneythink, and Counterpoint.
|
||||||
|
</div>
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="aaron.jpg">
|
||||||
|
Aaron is a junior computer science major with a minor in music. On
|
||||||
|
campus, Aaron is a four-time teaching assistant for 15-122, president of
|
||||||
|
Delta Tau Delta, and has served in various student government and senate
|
||||||
|
roles.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Why we care</h2>
|
||||||
|
<img src="care.jpg">
|
||||||
|
|
||||||
|
<div class="clearfix">
|
||||||
|
<div class="block block-half">
|
||||||
|
<h3>Vaasavi</h3>
|
||||||
|
In her time at Carnegie Mellon, Vaasavi has always wanted to make
|
||||||
|
student's lives better. After working with administration on the
|
||||||
|
University Strategic Plan, she realized that students were missing a
|
||||||
|
vital part of their Carnegie Mellon Experience: the infrastructure to
|
||||||
|
be innovators and leaders outside of the classroom. Since then, she
|
||||||
|
has worked to create environments encouraging students to think of
|
||||||
|
ways to change campus for the better. In her work as CA of E Tower,
|
||||||
|
she created a thinly-veiled incentive structure for students to engage
|
||||||
|
with the outside community. She wants to bring this to the overall CMU
|
||||||
|
community to make permanent improvements to campus.
|
||||||
|
</div>
|
||||||
|
<div class="block block-half">
|
||||||
|
<h3>Aaron</h3>
|
||||||
|
When Aaron first came to Carnegie Mellon, he took up as many
|
||||||
|
opportunities to try new things and engage with the campus as
|
||||||
|
possible. He felt that he grew and learned far more outside the
|
||||||
|
classroom. Not everyone takes that same path. More than anything else,
|
||||||
|
students are forced to prioritize at Carnegie Mellon, and that is the
|
||||||
|
cause of a lot of stress. But students should not have to make that
|
||||||
|
choice. Engaging and exploration with the campus outside the classroom
|
||||||
|
should be an integral part of the Carnegie Mellon experience.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 id="platform">How we will help</h2>
|
||||||
|
|
||||||
|
<div class="clearfix">
|
||||||
|
<div class="block block-third">
|
||||||
|
<img src="icon0.png">
|
||||||
|
<h3>Fiscal Transparency</h3>
|
||||||
|
As students, we deserve to know where our tuition is going, how our
|
||||||
|
administrators are getting paid and about the university's spending.
|
||||||
|
Aaron and Vaasavi have read CMU's tax forms, so you don't have to.
|
||||||
|
Additionally, we are constantly asked for donations, yet it's not
|
||||||
|
always clear where that money is used. Look out for infographics on
|
||||||
|
our Facebook page! #financefridays
|
||||||
|
</div>
|
||||||
|
<div class="block block-third">
|
||||||
|
<img src="icon1.png">
|
||||||
|
<h3>The Model for Social Change</h3>
|
||||||
|
If we're going to change the world, we might as well get started. We
|
||||||
|
call it the President's Initiative--the common thread of the CMU
|
||||||
|
experience that we have the power to change. Vaasavi and Aaron
|
||||||
|
propose to mobilize club presidents around a common issue, and reward
|
||||||
|
the clubs and organizations that provide innovative cultural
|
||||||
|
solutions on our campus.
|
||||||
|
</div>
|
||||||
|
<div class="block block-third">
|
||||||
|
<img src="icon2.png">
|
||||||
|
<h3>Student Government Transparency</h3>
|
||||||
|
It shouldn't be normal that no one knows what Student Government
|
||||||
|
Executives do. The Student Body President should make an effort to be
|
||||||
|
present and available to all students, and regularly inform the
|
||||||
|
student body on what they're up to. Vaasavi and Aaron propose making
|
||||||
|
all student organization transactions public, a weekly column in the
|
||||||
|
Tartan, and going beyond the constitutionally required SBP office
|
||||||
|
hours in highly trafficked areas of campus, so there are no barriers
|
||||||
|
to being informed.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 id="team">Our team</h2>
|
||||||
|
<div class="clearfix">
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="olivia.jpg">
|
||||||
|
<h3>Olivia Roy - Chief of Staff</h3>
|
||||||
|
|
||||||
|
I've known Aaron since we were freshmen in E-Tower. We and our
|
||||||
|
friends would sit on the floor of his room and talk about how we had
|
||||||
|
grown since high school. As introspective as those
|
||||||
|
conversations are, I don't want to just talk anymore, I want to do
|
||||||
|
something. Vaasavi has a compelling call to action, and the
|
||||||
|
leadership qualities that we need in a Student Body President. I'm
|
||||||
|
proud to support Vaas and Aaron because they don't just want to talk
|
||||||
|
about how CMU has changed us, but how we can change CMU.
|
||||||
|
</div>
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="zach.jpg">
|
||||||
|
<h3>Zach Newman - Recruitment</h3>
|
||||||
|
I support Vaasavi because from our first meeting, I knew how much
|
||||||
|
passion she has for this school and how much she is able to make
|
||||||
|
positive change. After conversations with her about deep rooted
|
||||||
|
issues we face as students, I realized the importance to have a leader
|
||||||
|
who understands so many different cultures within the student body to
|
||||||
|
make our four years at Carnegie Mellon more meaningful, impactful,
|
||||||
|
and positive. Despite her humility, I fully believe Vaasavi fits that
|
||||||
|
role and I am proud to be a part of her campaign.
|
||||||
|
</div>
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="srishti.jpg">
|
||||||
|
<h3>Srishti Jain - Public Relations</h3>
|
||||||
|
|
||||||
|
I'm tired of merely talking about social change, and am ready for
|
||||||
|
students at Carnegie Mellon to actually make change. I believe Vaasavi
|
||||||
|
and Aaron are the best candidates to facilitate these changes. With
|
||||||
|
their experience, ambition, and thoughtfulness, I know they have the
|
||||||
|
ability to improve the lives of the CMU student body. After witnessing
|
||||||
|
Vaasavi and Aaron in Student Senate for the past few years, I can
|
||||||
|
confidently say Vaasavi and Aaron will be meaningful and transparent
|
||||||
|
with their initiatives.
|
||||||
|
</div>
|
||||||
|
<div class="block block-half">
|
||||||
|
<img src="bettina.jpg">
|
||||||
|
<h3>Bettina Chou - Designer</h3>
|
||||||
|
The CMU design curriculum has instilled upon me a habit of looking at
|
||||||
|
problems as systems on various scales and looking for entry points to
|
||||||
|
resolve certain problem spaces. So, hearing Vaasavi's approach, I was
|
||||||
|
pleasantly surprised to learn the methods in econ/finance tackled
|
||||||
|
issues in a similar, yet more empirical way. Combined with her
|
||||||
|
intrinsic compassion and empathy, I am confident in her
|
||||||
|
solution-oriented mindset. I support her and Aaron because I believe
|
||||||
|
they will create effective solutions with a purpose as opposed to
|
||||||
|
temporary band-aid solutions.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2 id="contact">Have questions? Let's chat</h2>
|
||||||
|
|
||||||
|
<img src="contact.jpg">
|
||||||
|
|
||||||
|
Please feel free to contact us. We would be more than happy to talk over
|
||||||
|
coffee or tea.
|
||||||
|
|
||||||
|
<ul class="contact">
|
||||||
|
<li>Vaasavi Unnava:
|
||||||
|
<a href="mailto:vunnava@cmu.edu">vunnava@cmu.edu</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Aaron Gutierrez:
|
||||||
|
<a href="mailto:aarongutierrez@cmu.edu">aarongutierrez@cmu.edu</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
Vaasavi and Aaron 2016<br />
|
||||||
|
<a href="http://www.vaasandaaron.com">vaasandaaron.com</a><br />
|
||||||
|
<a href="http://www.vaasavi.com">vaasavi.com</a><br />
|
||||||
|
<a href="http://www.aarongutierrez.com">aarongutierrez.com</a>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
ga('create', 'UA-62761470-4', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
campaign/logo.png
Normal file
|
After Width: | Height: | Size: 6.6 KiB |
BIN
campaign/olivia.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
138
campaign/photo.html
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Profile Picture Creator - Vaasavi and Aaron 2016</title>
|
||||||
|
<script src="https://use.typekit.net/bdx7ivv.js"></script>
|
||||||
|
<script>try{Typekit.load({ async: true });}catch(e){}</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="site.css" >
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<script>
|
||||||
|
window.fbAsyncInit = function() {
|
||||||
|
FB.init({
|
||||||
|
appId : '1522083631429252',
|
||||||
|
xfbml : true,
|
||||||
|
version : 'v2.5'
|
||||||
|
});
|
||||||
|
|
||||||
|
checkLoginState();
|
||||||
|
};
|
||||||
|
|
||||||
|
(function(d, s, id){
|
||||||
|
var js, fjs = d.getElementsByTagName(s)[0];
|
||||||
|
if (d.getElementById(id)) {return;}
|
||||||
|
js = d.createElement(s); js.id = id;
|
||||||
|
js.src = "http://connect.facebook.net/en_US/sdk.js";
|
||||||
|
fjs.parentNode.insertBefore(js, fjs);
|
||||||
|
}(document, 'script', 'facebook-jssdk'));
|
||||||
|
|
||||||
|
function statusChangeCallback(response) {
|
||||||
|
if (response.status === 'connected') {
|
||||||
|
testAPI();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkLoginState() {
|
||||||
|
FB.getLoginStatus(function(response) {
|
||||||
|
statusChangeCallback(response);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function testAPI() {
|
||||||
|
FB.api('/me/picture', {width: '800'}, function(response) {
|
||||||
|
if (response && !response.error) {
|
||||||
|
var image = document.getElementById("basePic");
|
||||||
|
image.src = response.data.url;
|
||||||
|
image.onload = function() {
|
||||||
|
makeImage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeImage() {
|
||||||
|
document.getElementById('profPic').alt=
|
||||||
|
"You need an HTML5 compatible browser to use this feature";
|
||||||
|
|
||||||
|
var canvas = document.getElementById('profPicCanvas');
|
||||||
|
var context = canvas.getContext("2d");
|
||||||
|
|
||||||
|
var image = document.getElementById("basePic");
|
||||||
|
canvas.height = 800 * image.height / image.width;
|
||||||
|
|
||||||
|
// img, x, y, width, height
|
||||||
|
context.drawImage(document.getElementById("basePic"), 0, 0, 800, canvas.height);
|
||||||
|
context.drawImage(document.getElementById("logoPic"), 0, canvas.height - 242, 800, 242);
|
||||||
|
|
||||||
|
document.getElementById('profPic').src = canvas.toDataURL();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.onload = function() {
|
||||||
|
makeImage();
|
||||||
|
|
||||||
|
document.getElementById('uploadImg').onchange = function(e) {
|
||||||
|
var reader = new FileReader();
|
||||||
|
|
||||||
|
reader.onload = function(e) {
|
||||||
|
document.getElementById('basePic').src = e.target.result;
|
||||||
|
makeImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
reader.readAsDataURL(e.target.files[0]);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="header">
|
||||||
|
<div class="mobile">
|
||||||
|
<img src="logo.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<nav class="desktop">
|
||||||
|
<img src="logo.png">
|
||||||
|
<ul class="clearfix">
|
||||||
|
<li><a href="index.html#contact">Contact</a></li>
|
||||||
|
<li><a href="#">Picture Creator</a></li>
|
||||||
|
<li><a href="index.html#team">Team</a></li>
|
||||||
|
<li><a href="index.html#platform">Platform</a></li>
|
||||||
|
<li><a href="index.html#about">About</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<h2>Profile Picture Creator</h2>
|
||||||
|
Login with Facebook to create your picture
|
||||||
|
|
||||||
|
<fb:login-button scope="public_profile" onlogin="checkLoginState();">
|
||||||
|
</fb:login-button>
|
||||||
|
|
||||||
|
or upload another image
|
||||||
|
<input type="file" name="image" accept="image/*" id="uploadImg">
|
||||||
|
|
||||||
|
<canvas id="profPicCanvas" width="800" height="800" class="hidden"></canvas>
|
||||||
|
<img class="profPic" id="profPic">
|
||||||
|
|
||||||
|
<img id="basePic" src="cover.jpg" crossOrigin="Anonymous" class="hidden">
|
||||||
|
<img id="logoPic" src="frame.png" class="hidden">
|
||||||
|
<div class="footer">
|
||||||
|
Vaasavi and Aaron 2016<br />
|
||||||
|
<a href="http://www.vaasandaaron.com">vaasandaaron.com</a><br />
|
||||||
|
<a href="http://www.vaasavi.com">vaasavi.com</a><br />
|
||||||
|
<a href="http://www.aarongutierrez.com">aarongutierrez.com</a>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
||||||
|
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
||||||
|
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
||||||
|
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
||||||
|
|
||||||
|
ga('create', 'UA-62761470-4', 'auto');
|
||||||
|
ga('send', 'pageview');
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
50
campaign/pic.html
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Random imgur image</title>
|
||||||
|
<style type="text/css">
|
||||||
|
img { max-width: 100%; height: auto; }
|
||||||
|
</style>
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
function randomString(string_length)
|
||||||
|
{
|
||||||
|
var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghiklmnopqrstuvwxyz";
|
||||||
|
var output = "";
|
||||||
|
var index;
|
||||||
|
|
||||||
|
for (var i = 0; i < string_length; i++)
|
||||||
|
{
|
||||||
|
var index = Math.floor(Math.random() * chars.length);
|
||||||
|
output += chars.substring(index, index + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getImages()
|
||||||
|
{
|
||||||
|
var numTries = 1;
|
||||||
|
var imgObject = new Image();
|
||||||
|
var dots = "";
|
||||||
|
|
||||||
|
imgObject.onload = function()
|
||||||
|
{
|
||||||
|
if (this.width == 161 && this.height == 81)
|
||||||
|
{
|
||||||
|
this.src = "http://i.imgur.com/" + randomString(5) + ".jpg";
|
||||||
|
dots += ".";
|
||||||
|
document.getElementById('a').innerHTML = "Please wait..." + dots;
|
||||||
|
numTries++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
document.getElementById('a').innerHTML = "It took " + numTries + (numTries == 1 ? " try" : " tries") + " to get this picture. <a href=\"javascript:getImages();\">Load new image</a><br/><br/><a href=\"" + imgObject.src + "\">" + imgObject.src + "<br/><img src=\"" + imgObject.src + "\" /></a>";
|
||||||
|
}
|
||||||
|
|
||||||
|
// First image attempt that sets off the onload code defined above
|
||||||
|
imgObject.src = "http://i.imgur.com/" + randomString(5) + ".jpg";
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<body onLoad="getImages();">
|
||||||
|
<h1>Random Imgur image</h1>
|
||||||
|
<div id="a">Please wait...</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
170
campaign/platform.html
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a href="http://www.vaasandaaron.com" style="text-align: center;">
|
||||||
|
Visit Vaas and Aaron's official campaign website here.
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<img src="http://www.vaasandaaron.com/banner.jpg" width="100%" alt="Cover Photo">
|
||||||
|
|
||||||
|
<p>Thanks for checking out our platform!</p>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
We're Vaasavi Unnava and Aaron Gutierrez, two rising seniors running for
|
||||||
|
Student Body President and Vice President. But this election isn't about
|
||||||
|
us--it's about you. It's about giving ourselves the tools to change campus for
|
||||||
|
the better, and leave a legacy we're proud of. Let's make change, together.
|
||||||
|
</p>
|
||||||
|
<h2>
|
||||||
|
Here's how we're making sure you have the power to do just that:
|
||||||
|
</h2>
|
||||||
|
<h3>
|
||||||
|
Platform for Social Change: The President's Initiative
|
||||||
|
</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Move the Board of the Directors to the beginning of the year, where clubs
|
||||||
|
and organizations build partnerships to make change
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Set the agenda to address cultural problems on our campus, from SARV to
|
||||||
|
Mental Health
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Reward the organization that provides the most innovative solution to a
|
||||||
|
prevalent campus problem
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
Fiscal Transparency: Getting the Information We Deserve
|
||||||
|
</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Provide flowcharts describing university budgetary process
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Bring transparency to spending of the endowment
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Create tangible goals for class donations, like material upgrades to the
|
||||||
|
campus community
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3>
|
||||||
|
Student Government Transparency: For the Students
|
||||||
|
</h3>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Hold weekly office hours in the highest trafficked locations of campus
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Create "To StuGov With Love" Facebook group, where students can directly
|
||||||
|
interact with student government officials
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Write a weekly column for the Tartan outlining issues and decisions made
|
||||||
|
that week
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Let's create a campus where we get to take the lead on making CMU what we want
|
||||||
|
it to be, instead of waiting for administration to fix it. Why can we make
|
||||||
|
this happen?
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<h2>Why We're Qualified</h2>
|
||||||
|
|
||||||
|
<div style="display: -webkit-flex; display: flex; width: 100%;
|
||||||
|
-webkit-flex-wrap: wrap; flex-wrap: wrap">
|
||||||
|
<div style="
|
||||||
|
-webkit-flex-grow: 1; -webkit-flex-basis: 0;
|
||||||
|
flex-grow: 1; flex-basis: 0; margin: 10px; min-width: 200px" >
|
||||||
|
<h3>Vaasavi Unnava</h3>
|
||||||
|
<h4>Student Body President</h4>
|
||||||
|
|
||||||
|
<img src="http://www.vaasandaaron.com/vaas.jpg" width="100%">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Vaasavi is a third year economics major at Carnegie Mellon. She is the
|
||||||
|
Community Advisor of Morewood E Tower and spent two years serving in the
|
||||||
|
Student Senate. In her tenure, she has:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Started and managed the First Lectures (Watch at
|
||||||
|
<a href="https://youtube.com/thefirstlectures">youtube.com/thefirstlectures</a>)
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Co-founded the Sexual Assault and Relationship Violence Prevention
|
||||||
|
(SARVP) committee, where her team helped improve graduate student
|
||||||
|
orientation and put together the TartanHacks branch SARV hackathon.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Reinitiated CMU's participation in Pittsburgh Student Government
|
||||||
|
Council
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Created and taught a StuCo on financial literacy for the CMU Student
|
||||||
|
(98-272!)
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Built an incentive structure in Morewood E Tower to significantly
|
||||||
|
raise engagement with the city of Pittsburgh (and accidentally
|
||||||
|
eliminated stress culture as a byproduct)
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Chaired the Business Affairs Committee in the Student Senate, getting
|
||||||
|
new dumbbells in Skibo Gym, among other initiatives
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div style="
|
||||||
|
-webkit-flex-grow: 1; -webkit-flex-basis: 0;
|
||||||
|
flex-grow: 1; flex-basis: 0; margin: 10px; min-width: 200px" >
|
||||||
|
<h3>Aaron Gutierrez</h3>
|
||||||
|
<h4>Student Body Vice President</h4>
|
||||||
|
|
||||||
|
<img src="http://www.vaasandaaron.com/aaron.jpg" width="100%">
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Aaron is a third year computer science major with a minor in music at Carnegie
|
||||||
|
Mellon. In his tenure, he has:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
Served as President and Treasurer of Delta Tau Delta Fraternity
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Worked for two years as a teaching assistant for 15-122
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Advised Dining Services with selecting the new Skibo Cafe and Scott
|
||||||
|
Hall dining vendor
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Served on the Academic Review board and University Disciplinary
|
||||||
|
committee
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
Allocated student organization space in the CUC in 2014 and 2016
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Thank you for taking the time to read through all of this! If you have any
|
||||||
|
questions, we'd love to get coffee or tea--please reach out to us at
|
||||||
|
<a href="mailto:vunnava@cmu.edu">vunnava@cmu.edu</a> or
|
||||||
|
<a href="mailto:aarongutierrez@cmu.edu">aarongutierrez@cmu.edu</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
campaign/privacy.html
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Vaasavi and Aaron 2016</title>
|
||||||
|
<script src="https://use.typekit.net/bdx7ivv.js"></script>
|
||||||
|
<script>try{Typekit.load({ async: true });}catch(e){}</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="site.css" >
|
||||||
|
<link rel="icon" type="image/png" href="favicon.png" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="header">
|
||||||
|
<div class="mobile">
|
||||||
|
<img src="logo.png">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="main">
|
||||||
|
<nav class="desktop">
|
||||||
|
<img src="logo.png">
|
||||||
|
<ul class="clearfix">
|
||||||
|
<li><a href="/index.html#contact">Contact</a></li>
|
||||||
|
<li><a href="/index.html#team">Team</a></li>
|
||||||
|
<li><a href="/index.html#platform">Platform</a></li>
|
||||||
|
<li><a href="/index.html#about">About</a></li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<h2>Privacy Policy</h2>
|
||||||
|
|
||||||
|
We use Google Analytics to collect anonymous information about who visits
|
||||||
|
our site. Other than that, we don't know anything about you. But if you'd
|
||||||
|
like to know more about us, please <a href="index.html#contact">contact
|
||||||
|
us</a>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
114
campaign/site.css
Normal file
@@ -0,0 +1,114 @@
|
|||||||
|
/* Variables */
|
||||||
|
/* sizes */
|
||||||
|
/* font sizes */
|
||||||
|
/* pallet */
|
||||||
|
h1, h2, h3, h4, h5, h6 {
|
||||||
|
font-family: "proxima-nova-alt-condensed", Arial, Helvetica, sans-serif;
|
||||||
|
font-weight: bold; }
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: "proxima-nova", Arial, Helvetica, sans-serif;
|
||||||
|
font-size: 16px;
|
||||||
|
color: rgba(0, 0, 0, 0.9);
|
||||||
|
width: 100%;
|
||||||
|
margin: 0px; }
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 64px;
|
||||||
|
margin: 64px 16px;
|
||||||
|
display: inline; }
|
||||||
|
|
||||||
|
h2 {
|
||||||
|
font-size: 48px;
|
||||||
|
margin-top: 48px;
|
||||||
|
text-transform: uppercase; }
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
margin-top: -16px; }
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 16px; }
|
||||||
|
|
||||||
|
nav img {
|
||||||
|
width: initial; }
|
||||||
|
nav ul {
|
||||||
|
list-style-type: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 16px 0 0;
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box; }
|
||||||
|
nav li {
|
||||||
|
float: right; }
|
||||||
|
nav li a {
|
||||||
|
text-align: center;
|
||||||
|
width: 64px;
|
||||||
|
color: #38526b;
|
||||||
|
display: block;
|
||||||
|
padding: 8px;
|
||||||
|
text-decoration: none; }
|
||||||
|
nav li a:hover {
|
||||||
|
font-weight: bold; }
|
||||||
|
|
||||||
|
img {
|
||||||
|
width: 100%;
|
||||||
|
margin-bottom: 32px; }
|
||||||
|
|
||||||
|
img.profPic {
|
||||||
|
margin-top: 32px; }
|
||||||
|
|
||||||
|
.main, .header {
|
||||||
|
padding: 16px;
|
||||||
|
margin-right: auto;
|
||||||
|
margin-left: auto; }
|
||||||
|
|
||||||
|
.block {
|
||||||
|
float: left;
|
||||||
|
display: block;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 16px; }
|
||||||
|
|
||||||
|
.footer {
|
||||||
|
border-top: 1px solid #ba3845;
|
||||||
|
text-align: center;
|
||||||
|
margin: 16px;
|
||||||
|
padding: 16px; }
|
||||||
|
|
||||||
|
.standout {
|
||||||
|
background-color: #ba3845;
|
||||||
|
color: #ffeacf;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
padding: 16px; }
|
||||||
|
|
||||||
|
.desktop {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.clearfix:after {
|
||||||
|
visibility: hidden;
|
||||||
|
display: block;
|
||||||
|
font-size: 0;
|
||||||
|
content: " ";
|
||||||
|
clear: both;
|
||||||
|
height: 0; }
|
||||||
|
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
.desktop {
|
||||||
|
display: inherit; }
|
||||||
|
|
||||||
|
.mobile {
|
||||||
|
display: none; }
|
||||||
|
|
||||||
|
.main, .header {
|
||||||
|
min-width: 752px;
|
||||||
|
max-width: 921.6px; }
|
||||||
|
|
||||||
|
.block-half {
|
||||||
|
max-width: 50%; }
|
||||||
|
|
||||||
|
.block-third {
|
||||||
|
max-width: 33.333%; } }
|
||||||
|
|
||||||
|
/*# sourceMappingURL=site.css.map */
|
||||||
BIN
campaign/srishti.jpg
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
campaign/vaas.jpg
Normal file
|
After Width: | Height: | Size: 38 KiB |
BIN
campaign/zach.gif
Normal file
|
After Width: | Height: | Size: 260 KiB |
BIN
campaign/zach.jpg
Normal file
|
After Width: | Height: | Size: 39 KiB |
BIN
img/aaron.jpg
Normal file
|
After Width: | Height: | Size: 8.6 KiB |
BIN
img/aaron@2x.jpg
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
img/aaron@3x.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
72
index.html
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<title>Aaron Gutierrez</title>
|
||||||
|
<link rel="stylesheet" href="site.css" >
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<meta property="og:title" content="Aaron Gutierrez">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<meta property="og:url" content="https://www.aarongutierrez.com">
|
||||||
|
<meta property="og:image" content="https://www.aarongutierrez.com/img/aaron@3x.jpg">
|
||||||
|
<meta property="og:description" content="Aaron Gutierrez is a software engineer at Asana, a CMU graduate, and fond of benches.">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<h1>Aaron Gutierrez</h1>
|
||||||
|
<img id="aaron" alt="Aaron" src="img/aaron.jpg"
|
||||||
|
srcset="img/aaron.jpg, img/aaron@2x.jpg 2x,img/aaron@3x.jpg 3x">
|
||||||
|
<p>
|
||||||
|
Integrations Engineer @ <a href="https://asana.com">Asana</a><br>
|
||||||
|
Carnegie Mellon University, SCS 2017
|
||||||
|
</p>
|
||||||
|
</header>
|
||||||
|
<hr>
|
||||||
|
<main>
|
||||||
|
<h2>Work</h2>
|
||||||
|
<section>
|
||||||
|
<h3>Asana</h3>
|
||||||
|
<ul>
|
||||||
|
<li>I've helped build Asana's
|
||||||
|
<a href="https://blog.asana.com/2018/05/new-asana-slack-integration/">
|
||||||
|
Slack</a>,
|
||||||
|
<a href="https://blog.asana.com/2017/10/emails-tasks-gmail-asana-integration/">
|
||||||
|
Gmail</a>,
|
||||||
|
<a href="https://blog.asana.com/2017/09/wufoo-web-form-integration/">
|
||||||
|
Forms</a>, and
|
||||||
|
<a href="https://asana.com/apps/csv-importer">CSV</a> integrations.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section>
|
||||||
|
<h3>Carnegie Mellon</h3>
|
||||||
|
<ul>
|
||||||
|
<li>I extended the <a href="https://ispc.github.io/ispc.html">Intel
|
||||||
|
SPMD Program Compiler (ISPC)</a> to support polymorphic datatypes in
|
||||||
|
my <a href="/15418/index.html">15-418 Final Project</a></li>
|
||||||
|
<li>I spent several semesters as a teaching assistant for
|
||||||
|
<abbr title="Principles of Imperitive Computation">15-122</abbr>,
|
||||||
|
<abbr title="History of Computing">15-292</abbr>, and
|
||||||
|
<abbr title="Compiler Design">15-411</abbr>.</li>
|
||||||
|
<li>I served as the Student Body Vice President for the 2016-2017 school
|
||||||
|
year</li>
|
||||||
|
<li>I served as Treasurer and President of the
|
||||||
|
<a href="https://rushdelt.com">Delta Beta Chapter</a> of
|
||||||
|
<a href="https://www.delts.org">∆T∆</a>, where I built and maintained our
|
||||||
|
reimbursement tracking web application.</li>
|
||||||
|
</ul>
|
||||||
|
<h2>Links</h2>
|
||||||
|
<ul>
|
||||||
|
<li><a href="bench/1.html">My Benches</a></li>
|
||||||
|
<li>Github: <a href="https://github.com/aarongut">aarongut</a></li>
|
||||||
|
<li>Public Key: <a href="pubkey.asc">9CAC97E9</a></li>
|
||||||
|
<li><a href="campaign/index.html">Campaign Website</a></li>
|
||||||
|
<li>Email: <a href="mailto:aaron@aarongutierrez.com">aaron@aarongutierrez.com</a>
|
||||||
|
</ul>
|
||||||
|
</main>
|
||||||
|
<hr>
|
||||||
|
<footer>
|
||||||
|
<a href="https://wwww.aarongutierrez.com">www.aarongutierrez.com</a>
|
||||||
|
<a href="https://www.frat.tech">www.frat.tech</a>
|
||||||
|
</footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
112
pub.py
Executable file
@@ -0,0 +1,112 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import boto3
|
||||||
|
|
||||||
|
BUCKET='www.aarongutierrez.com'
|
||||||
|
AWS_ACCESS_KEY='AKIAIDTVRR2EKQ5FYIEQ'
|
||||||
|
AWS_SECRET_KEY='juQBg70qJ2xK1me8W21byUYpfRqExvyK4rbhnLEq'
|
||||||
|
|
||||||
|
s3 = boto3.client('s3',
|
||||||
|
aws_access_key_id=AWS_ACCESS_KEY,
|
||||||
|
aws_secret_access_key=AWS_SECRET_KEY)
|
||||||
|
|
||||||
|
bench_fmt = """<a href="/img/bench/{0:03d}.jpg"><picture><source type="image/webp" srcset="/img/bench/{0:03d}.thumb.webp, /img/bench/{0:03d}.thumb@2x.webp 2x"><img src="/img/bench/{0:03d}.thumb.jpg"></picture></a>""" + "\n"
|
||||||
|
|
||||||
|
TYPE_MAP = {
|
||||||
|
'asc': 'text/plain',
|
||||||
|
'css': 'text/css',
|
||||||
|
'gif': 'image/gif',
|
||||||
|
'html': 'text/html; charset=utf8',
|
||||||
|
'jpg': 'image/jpeg',
|
||||||
|
'png': 'image/png',
|
||||||
|
'webp': 'image/webp',
|
||||||
|
}
|
||||||
|
|
||||||
|
def upload_file(filename):
|
||||||
|
print('Uploading {} to {}/{}'.format(filename, BUCKET, filename))
|
||||||
|
ext = filename.split('.')[-1]
|
||||||
|
|
||||||
|
s3.upload_file(filename, BUCKET, filename, ExtraArgs={
|
||||||
|
'ACL': 'public-read',
|
||||||
|
'ContentType': TYPE_MAP[ext]
|
||||||
|
})
|
||||||
|
print('\tDone.')
|
||||||
|
|
||||||
|
def filter_filenames(filenames, ext):
|
||||||
|
for f in filenames:
|
||||||
|
if (isinstance(ext, (list,)) and (f.split('.')[-1] in ext) \
|
||||||
|
or f.split('.')[-1] == ext):
|
||||||
|
yield f
|
||||||
|
|
||||||
|
def upload_root():
|
||||||
|
upload_file('index.html')
|
||||||
|
upload_file('site.css')
|
||||||
|
upload_file('pubkey.asc')
|
||||||
|
|
||||||
|
def upload_bench():
|
||||||
|
imgs = os.listdir('img/bench')
|
||||||
|
img_files = [f for f in filter_filenames(imgs, ['jpg', 'webp'])]
|
||||||
|
num_imgs = int(len(img_files) / 4)
|
||||||
|
|
||||||
|
with open('bench_template.html', 'r') as f:
|
||||||
|
template = f.read()
|
||||||
|
|
||||||
|
for i in range(1, num_imgs+1, 16):
|
||||||
|
page = ''
|
||||||
|
for j in range(i, min(num_imgs+1, i+16)):
|
||||||
|
page += bench_fmt.format(j)
|
||||||
|
|
||||||
|
prev_pg = i//16
|
||||||
|
next_pg = i//16 + 2
|
||||||
|
|
||||||
|
prev_link = '#' if (prev_pg == 0) else '/bench/{}.html'.format(prev_pg)
|
||||||
|
next_link = '#' if (i+16 > num_imgs) else '/bench/{}.html'.format(next_pg)
|
||||||
|
|
||||||
|
with open('bench/{}.html'.format(i//16 + 1), 'w') as out:
|
||||||
|
out.write(template.format(page, prev_link, next_link))
|
||||||
|
|
||||||
|
files = filter_filenames(os.listdir('bench'), 'html')
|
||||||
|
for f in files:
|
||||||
|
upload_file('bench/{}'.format(f))
|
||||||
|
|
||||||
|
for f in img_files:
|
||||||
|
upload_file('img/bench/{}'.format(f))
|
||||||
|
|
||||||
|
def upload_img():
|
||||||
|
files = filter_filenames(os.listdir('img'), ['jpg', 'webp'])
|
||||||
|
for f in files:
|
||||||
|
upload_file('img/{}'.format(f))
|
||||||
|
|
||||||
|
def upload_15418():
|
||||||
|
upload_file('15418/index.html')
|
||||||
|
upload_file('15418/style.css')
|
||||||
|
|
||||||
|
def upload_campaign():
|
||||||
|
files = filter_filenames(os.listdir('campaign'),
|
||||||
|
['html', 'css', 'jpg', 'png', 'gif'])
|
||||||
|
for f in files:
|
||||||
|
upload_file('campaign/{}'.format(f))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
parser = argparse.ArgumentParser(description='Publish www.aarongutierrez.com')
|
||||||
|
|
||||||
|
pub_help = 'What to publish'
|
||||||
|
pub_choices = ['all', 'root', 'img', 'bench', '15418', 'campaign']
|
||||||
|
parser.add_argument('pub', choices=pub_choices, help=pub_help)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.pub == 'root' or args.pub == 'all':
|
||||||
|
upload_root()
|
||||||
|
if args.pub == 'img' or args.pub == 'all':
|
||||||
|
upload_img()
|
||||||
|
if args.pub == 'bench' or args.pub == 'all':
|
||||||
|
upload_bench()
|
||||||
|
if args.pub == '15418' or args.pub == 'all':
|
||||||
|
upload_15418()
|
||||||
|
if args.pub == 'campaign' or args.pub == 'all':
|
||||||
|
upload_campaign()
|
||||||
61
site.css
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
img#aaron {
|
||||||
|
width: 128px;
|
||||||
|
height: 128px;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
max-width: 800px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
header {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
footer {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-grid {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-grid a {
|
||||||
|
display: inline-block;
|
||||||
|
height: 160px;
|
||||||
|
margin-right: 40px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
width: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.img-grid img {
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
max-width: 160px;
|
||||||
|
max-height: 160px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.nav {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media(min-width:600px) {
|
||||||
|
header {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||