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;
|
||||
}
|
||||
}
|
||||