Merge branch 'master' into develop
This commit is contained in:
commit
92e250dc32
20
LICENSE
Normal file
20
LICENSE
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 Ian Adam Naval
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
32
README.md
Normal file
32
README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
ianonavy
|
||||||
|
========
|
||||||
|
|
||||||
|
Source code for my personal website.
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
* python 2.6+
|
||||||
|
* pip
|
||||||
|
* virtualenv
|
||||||
|
* nginx
|
||||||
|
* supervisord
|
||||||
|
|
||||||
|
Installing
|
||||||
|
----------
|
||||||
|
|
||||||
|
Exact commands vary with OS.
|
||||||
|
|
||||||
|
1. Clone git repository.
|
||||||
|
2. Create a virtual environment in the same directory, and source the `activate` script.
|
||||||
|
3. Navigate into the directory and install the required Python packages with `pip install -r requirements.txt`.
|
||||||
|
4. Symlink or copy the file `conf/nginx.conf` into the nginx configuration directory (e.g. `/etc/nginx/conf.d/ianonavy.conf` for CentOS).
|
||||||
|
5. Symlink or copy the file `conf/supervisord.conf` into the supervisord configuration directory.
|
||||||
|
6. Reload the config files of both nginx and supervisord, and ensure that both daemons are running.
|
||||||
|
|
||||||
|
Note that you probably need to edit the config files to point to the directory in which you cloned this repo as well as the `server_name` for nginx.
|
||||||
|
|
||||||
|
Updating
|
||||||
|
--------
|
||||||
|
|
||||||
|
To update, just run `git pull` in the repository. For the Web service, you may need to instruct supervisord to restart the daemons.
|
||||||
40
conf/nginx.conf
Normal file
40
conf/nginx.conf
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen 443 default_server ssl;
|
||||||
|
|
||||||
|
ssl_certificate /var/sites/ianonavy.com/ssl/unified.crt;
|
||||||
|
ssl_certificate_key /var/sites/ianonavy.com/ssl/ssl-decrypted.key;
|
||||||
|
|
||||||
|
server_name *.ianonavy.com ianonavy.com www.ianonavy.com;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/ianonavy.access.log;
|
||||||
|
error_log /var/log/nginx/ianonavy.error.log;
|
||||||
|
|
||||||
|
if ($host != 'ianonavy.com') {
|
||||||
|
rewrite ^/(.*)$ https://ianonavy.com/$1 permanent;
|
||||||
|
}
|
||||||
|
|
||||||
|
root /var/sites/ianonavy.com/www;
|
||||||
|
|
||||||
|
location = /robots.txt {
|
||||||
|
alias /var/www/robots/all/robots.txt;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /static/ { # STATIC_URL
|
||||||
|
alias /var/sites/ianonavy.com/www/src/static/; # STATIC_ROOT
|
||||||
|
expires off;
|
||||||
|
}
|
||||||
|
|
||||||
|
location = /google9677fb7678857b96.html {
|
||||||
|
rewrite ^/(.*) $1;
|
||||||
|
return 200 "google-site-verification: google9677fb7678857b96.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
location / { try_files $uri @ianonavy; }
|
||||||
|
location @ianonavy {
|
||||||
|
include fastcgi_params;
|
||||||
|
fastcgi_param PATH_INFO $fastcgi_script_name;
|
||||||
|
fastcgi_param SCRIPT_NAME "";
|
||||||
|
fastcgi_pass unix:/tmp/ianonavy-fcgi.sock;
|
||||||
|
}
|
||||||
|
}
|
||||||
24
conf/supervisord.conf
Normal file
24
conf/supervisord.conf
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
[fcgi-program:ianonavy]
|
||||||
|
command=/var/sites/ianonavy.com/www/src/ianonavy.fcgi
|
||||||
|
socket=unix:///tmp/ianonavy-fcgi.sock
|
||||||
|
process_name=%(program_name)s_%(process_num)02d
|
||||||
|
directory=/var/sites/ianonavy.com/www/src
|
||||||
|
environment=PATH="/var/sites/ianonavy.com/www/bin"
|
||||||
|
numprocs=5
|
||||||
|
priority=999
|
||||||
|
autostart=true
|
||||||
|
autorestart=true
|
||||||
|
startsecs=1
|
||||||
|
startretries=3
|
||||||
|
exitcodes=0,2
|
||||||
|
stopsignal=QUIT
|
||||||
|
stopwaitsecs=10
|
||||||
|
user=app
|
||||||
|
redirect_stderr=true
|
||||||
|
stdout_logfile=/tmp/ianonavy.log
|
||||||
|
stdout_logfile_maxbytes=1MB
|
||||||
|
stdout_logfile_backups=10
|
||||||
|
stderr_logfile=/tmp/ianonavy_err.log
|
||||||
|
stderr_logfile_maxbytes=1MB
|
||||||
|
stderr_logfile_backups=10
|
||||||
|
|
||||||
2
requirements.txt
Normal file
2
requirements.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Flask
|
||||||
|
flup
|
||||||
6
src/ianonavy.fcgi
Executable file
6
src/ianonavy.fcgi
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
from flup.server.fcgi import WSGIServer
|
||||||
|
from server import app
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
WSGIServer(app, bindAddress='/tmp/ianonavy-fcgi.sock', umask=0002).run()
|
||||||
@ -37,7 +37,7 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #e8e8e8;
|
background-color: #e8e8e8;
|
||||||
color: #000;
|
color: #000;
|
||||||
box-shadow: 4px 4px 6px #000;
|
box-shadow: 2px 2px 10px #0F0907;
|
||||||
flex: 1 0 auto; }
|
flex: 1 0 auto; }
|
||||||
.portfolio-item p {
|
.portfolio-item p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -45,10 +45,31 @@
|
|||||||
|
|
||||||
/* iPhone */
|
/* iPhone */
|
||||||
@media only screen and (min-device-width: 320px) and (max-device-width: 568px) {
|
@media only screen and (min-device-width: 320px) and (max-device-width: 568px) {
|
||||||
|
#header {
|
||||||
|
font-size: .8em; }
|
||||||
|
|
||||||
|
.section {
|
||||||
|
padding: 8px; }
|
||||||
|
|
||||||
|
.about-section {
|
||||||
|
margin: 0;
|
||||||
|
max-width: 288px; }
|
||||||
|
|
||||||
|
.about-section ul {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none; }
|
||||||
|
|
||||||
|
.portfolio-items {
|
||||||
|
padding: 0; }
|
||||||
|
|
||||||
.portfolio-item {
|
.portfolio-item {
|
||||||
|
margin: 8px 0 0;
|
||||||
width: 256px; }
|
width: 256px; }
|
||||||
|
|
||||||
#calendar {
|
.technology-list img {
|
||||||
|
width: 100%; }
|
||||||
|
|
||||||
|
#calendar, #calendar-label {
|
||||||
display: none; } }
|
display: none; } }
|
||||||
.screenshot {
|
.screenshot {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
@ -58,7 +79,8 @@
|
|||||||
#calendar {
|
#calendar {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 1320px;
|
max-width: 1320px;
|
||||||
height: 480px; }
|
height: 480px;
|
||||||
|
border: 0; }
|
||||||
|
|
||||||
/* Force image on its own line for two-column layout */
|
/* Force image on its own line for two-column layout */
|
||||||
@media only screen and (min-width: 691px) and (max-width: 1054px) {
|
@media only screen and (min-width: 691px) and (max-width: 1054px) {
|
||||||
|
|||||||
@ -46,7 +46,7 @@
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #e8e8e8;
|
background-color: #e8e8e8;
|
||||||
color: #000;
|
color: #000;
|
||||||
box-shadow: 4px 4px 6px #000;
|
box-shadow: 2px 2px 10px #0F0907;
|
||||||
flex: 1 0 auto;
|
flex: 1 0 auto;
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@ -59,11 +59,38 @@
|
|||||||
@media only screen
|
@media only screen
|
||||||
and (min-device-width : 320px)
|
and (min-device-width : 320px)
|
||||||
and (max-device-width : 568px) {
|
and (max-device-width : 568px) {
|
||||||
|
#header {
|
||||||
|
font-size: .8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.about-section {
|
||||||
|
margin: 0;
|
||||||
|
max-width: 288px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.about-section ul {
|
||||||
|
padding: 0;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.portfolio-items {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.portfolio-item {
|
.portfolio-item {
|
||||||
|
margin: 8px 0 0;
|
||||||
width: 256px;
|
width: 256px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendar {
|
.technology-list img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#calendar, #calendar-label {
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -78,6 +105,7 @@ and (max-device-width : 568px) {
|
|||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 1320px;
|
max-width: 1320px;
|
||||||
height: 480px;
|
height: 480px;
|
||||||
|
border: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Force image on its own line for two-column layout */
|
/* Force image on its own line for two-column layout */
|
||||||
|
|||||||
@ -16,7 +16,7 @@ h1, h2, h3, h4 {
|
|||||||
/* Header */
|
/* Header */
|
||||||
#header {
|
#header {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 16px;
|
padding: 16px 0 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: #222;
|
background: #222;
|
||||||
color: #0f0;
|
color: #0f0;
|
||||||
@ -30,16 +30,19 @@ h1, h2, h3, h4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#tagline {
|
#tagline {
|
||||||
margin: 0;
|
margin: 0 auto;
|
||||||
|
padding: 0 0 8px;
|
||||||
font-size: .9em;
|
font-size: .9em;
|
||||||
color: #39e639;
|
color: #72bbfa;
|
||||||
|
border-bottom: 1px solid #fff;
|
||||||
|
width: 304px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Navigation */
|
/* Navigation */
|
||||||
#nav {
|
#nav {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 16px 0 0;
|
margin: 8px 0 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
@ -52,13 +55,17 @@ h1, h2, h3, h4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#nav li {
|
#nav li {
|
||||||
|
/*width: 61px;*/
|
||||||
|
margin: 0;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: 0 1em 0;
|
padding: 4px 8px;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 2px 2px 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#nav a {
|
#nav a {
|
||||||
color: #b9f73e;
|
color: #428bca;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main body */
|
/* Main body */
|
||||||
@ -95,6 +102,7 @@ h1, h2, h3, h4 {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
padding: .5em;
|
padding: .5em;
|
||||||
clear: both;
|
clear: both;
|
||||||
background: #fff;
|
background: #222;
|
||||||
|
color: #fff;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
src/static/img/competition.png
Normal file
BIN
src/static/img/competition.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
BIN
src/static/img/ian-280.jpg
Normal file
BIN
src/static/img/ian-280.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@ -8,17 +8,15 @@
|
|||||||
<meta name="description" content="Portfolio for software engineer and sysadmin Ian Adam Naval.">
|
<meta name="description" content="Portfolio for software engineer and sysadmin Ian Adam Naval.">
|
||||||
<meta name="author" content="Ian Adam Naval">
|
<meta name="author" content="Ian Adam Naval">
|
||||||
<meta name="robots" content="index,follow">
|
<meta name="robots" content="index,follow">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
||||||
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" type="text/css" media="screen" />
|
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" type="text/css" media="screen" />
|
||||||
{% block extrastyle %}{% endblock extrastyle %}
|
{% block extrastyle %}{% endblock extrastyle %}
|
||||||
|
|
||||||
<script src="{{ url_for('static', filename='lib/modernizr.js') }}"></script>
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
<header id="header">
|
<header id="header">
|
||||||
<h1 id="name">Ian Adam Naval</h1>
|
<h1 id="name">Ian Adam Naval</h1>
|
||||||
<span id="tagline">Software engineer/sysadmin from Los Angeles, CA</span>
|
<div id="tagline">Software engineer/sysadmin</div>
|
||||||
<nav id="nav">
|
<nav id="nav">
|
||||||
<ul>
|
<ul>
|
||||||
<li><a href="{{ url_for('home') }}#portfolio">Portfolio</a></li>
|
<li><a href="{{ url_for('home') }}#portfolio">Portfolio</a></li>
|
||||||
@ -38,6 +36,7 @@
|
|||||||
{% block footer %}Copyright © 2014 Ian Adam Naval. All rights reserved.{% endblock footer %}
|
{% block footer %}Copyright © 2014 Ian Adam Naval. All rights reserved.{% endblock footer %}
|
||||||
</footer>
|
</footer>
|
||||||
|
|
||||||
|
<script src="{{ url_for('static', filename='lib/modernizr.js') }}"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
var _gaq = _gaq || [];
|
var _gaq = _gaq || [];
|
||||||
_gaq.push(['_setAccount', 'UA-33981209-1']);
|
_gaq.push(['_setAccount', 'UA-33981209-1']);
|
||||||
@ -49,5 +48,6 @@
|
|||||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|||||||
@ -33,56 +33,54 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="portfolio" class="section">
|
<div id="portfolio" class="section center-wrapper">
|
||||||
<h2>Portfolio</h2>
|
<h2>Portfolio</h2>
|
||||||
<div id="resume"><a class="button" href='http://files.ianonavy.com/resume.pdf'>View Résumé</a></div>
|
<div id="resume"><a class="button" href='http://files.ianonavy.com/resume.pdf'>View Résumé</a></div>
|
||||||
|
|
||||||
<div id="portfolio-items" class="center-wrapper">
|
<div id="portfolio-items" class="">
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
<div class="portfolio-item center-wrapped">
|
||||||
<a href="http://mirrors.acm.wpi.edu/"><img src="{{ url_for('static', filename='img/mirrors.png') }}" alt="WPI ACM Mirrors screenshot" class="screenshot"></a>
|
<a target="_blank" href="http://mirrors.acm.wpi.edu/"><img src="{{ url_for('static', filename='img/mirrors.png') }}" alt="WPI ACM Mirrors screenshot" class="screenshot"></a>
|
||||||
<h3>WPI ACM Mirrors</h3>
|
<h3>WPI ACM Mirrors</h3>
|
||||||
<p>GNU/Linux mirrors for WPI folk.</p>
|
<p>GNU/Linux mirrors for WPI folk.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
<div class="portfolio-item center-wrapped">
|
||||||
<a href="http://acm.wpi.edu/"><img src="{{ url_for('static', filename='img/acm.png') }}" alt="WPI ACM Website screenshot" class="screenshot"></a>
|
<a target="_blank" href="http://acm.wpi.edu/"><img src="{{ url_for('static', filename='img/acm.png') }}" alt="WPI ACM Website screenshot" class="screenshot"></a>
|
||||||
<h3>WPI ACM Website</h3>
|
<h3>WPI ACM Website</h3>
|
||||||
<p>Homepage for the WPI ACM chapter.</p>
|
<p>Homepage for the WPI ACM chapter.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
<div class="portfolio-item center-wrapped">
|
||||||
<a href="http://sms-fixer.ianonavy.com/"><img src="{{ url_for('static', filename='img/sms-fixer.png') }}" alt="SMS Fixer screenshot" class="screenshot"></a>
|
<a target="_blank" href="http://competition.acm.wpi.edu/"><img src="{{ url_for('static', filename='img/competition.png') }}" alt="ACM Programming Competition screenshot" class="screenshot"></a>
|
||||||
|
<h3>ACM Programming Competition</h3>
|
||||||
|
<p>Programming competition framework for WPI.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="portfolio-item center-wrapped">
|
||||||
|
<a target="_blank" href="http://sms-fixer.ianonavy.com/"><img src="{{ url_for('static', filename='img/sms-fixer.png') }}" alt="SMS Fixer screenshot" class="screenshot"></a>
|
||||||
<h3>SMS Fixer</h3>
|
<h3>SMS Fixer</h3>
|
||||||
<p>Helps restore Android texts from Google Voice.</p>
|
<p>Helps restore Android texts from Google Voice.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
<div class="portfolio-item center-wrapped">
|
||||||
<a href="https://play.google.com/store/apps/details?id=com.mathhammer40k.mathhammer&hl=en"><img src="{{ url_for('static', filename='img/mathhammer.png') }}" alt="MathHammer screenshot" class="screenshot"></a>
|
<a target="_blank" href="http://potatoipsum.com/"><img src="{{ url_for('static', filename='img/potatoipsum.png') }}" alt="Potato Ipsum screenshot" class="screenshot"></a>
|
||||||
<h3>MathHammer 40k</h3>
|
|
||||||
<p>Damage stats calculator app for WarHammer 40k.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
|
||||||
<a href="https://play.google.com/store/apps/details?id=com.ianonavy.spammer&hl=en"><img src="{{ url_for('static', filename='img/smspammer.png') }}" alt="SMSpammer screenshot" class="screenshot"></a>
|
|
||||||
<h3>SMSpammer</h3>
|
|
||||||
<p>App for spamming text messages. <span class="cheeky-aside">(With permission.)</span></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="portfolio-item center-wrapped">
|
|
||||||
<a href="http://potatoipsum.com/"><img src="{{ url_for('static', filename='img/potatoipsum.png') }}" alt="Potato Ipsum screenshot" class="screenshot"></a>
|
|
||||||
<h3>Potato Ipsum</h3>
|
<h3>Potato Ipsum</h3>
|
||||||
<p>Lorem ipsum generator. With potatoes.</p>
|
<p>Lorem ipsum generator. With potatoes.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="portfolio-item center-wrapped">
|
||||||
|
<a target="_blank" href="https://play.google.com/store/apps/details?id=com.mathhammer40k.mathhammer&hl=en"><img src="{{ url_for('static', filename='img/mathhammer.png') }}" alt="MathHammer screenshot" class="screenshot"></a>
|
||||||
|
<h3>MathHammer 40k</h3>
|
||||||
|
<p>Damage stats calculator app for WarHammer 40k.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="contact" class="section">
|
<div id="contact" class="section center-wrapper">
|
||||||
<h2>Contact</h2>
|
<h2>Contact</h2>
|
||||||
<p>Information is on my <a href='http://files.ianonavy.com/resume.pdf'>résumé</a>.</p>
|
<p>Information is on my <a href='http://files.ianonavy.com/resume.pdf'>résumé</a>.</p>
|
||||||
<h3>Weekly Calendar</h3>
|
|
||||||
<iframe id="calendar" src="https://www.google.com/calendar/embed?showTitle=0&showNav=0&showPrint=0&showTabs=0&showCalendars=0&showTz=0&mode=WEEK&wkst=1&bgcolor=%23FFFFFF&src=ianonavy@gmail.com&color=%23A32929&src=sodbfdhm4q7api4qvf5h5k7rlg@group.calendar.google.com&color=%23B1440E&src=36gqite9pam369c6mknuttgsqg@group.calendar.google.com&color=%23125A12&src=jnqo9lo8efm5ogj78pr176qstg@group.calendar.google.com&color=%2323164E&src=a82i41iavlvd37d9fnrofklrms@group.calendar.google.com&color=%23182C57&src=achgl7e3m1pokdo8o1uqis70fk@group.calendar.google.com&color=%2323164E&src=doransmestad.com_da1erfts3egct17eb5511nduf8@group.calendar.google.com&src=ieikn7uck3o2ultbt19d9me740@group.calendar.google.com&color=%2323164E&ctz=America/New_York" frameborder="0"></iframe>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endblock main %}
|
{% endblock main %}
|
||||||
|
|||||||
@ -4,8 +4,12 @@
|
|||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<div class="section">
|
<div class="section">
|
||||||
<h2>Labs</h2>
|
<h2>Labs</h2>
|
||||||
<p>Welcome to my lab! This where I run all my experimental stuff.</p>
|
<p>Welcome to my lab! This where I run all my experimental stuff. My <a href="https://git.ianonavy.com/public">private Git server</a> has some public repositories if you are interested.</p>
|
||||||
<p>Click <a href="http://demo.ianonavy.com/">here</a> to see what I'm working on this very moment (if anything).</p>
|
<p>I also use <a href="http://demo.ianonavy.com/">demo.ianonavy.com</a> as a general purpose staging site. Check it out to see what I'm working on now!</p>
|
||||||
|
</div>
|
||||||
|
<div class="section">
|
||||||
|
<h2>Floppy Pig</h2>
|
||||||
|
<p>Just a small little <a href="http://floppypig.ianonavy.com/">game</a> I'm working on right now in my free time.</p>
|
||||||
</div>
|
</div>
|
||||||
{% endblock main %}
|
{% endblock main %}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user