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;
|
||||
background-color: #e8e8e8;
|
||||
color: #000;
|
||||
box-shadow: 4px 4px 6px #000;
|
||||
box-shadow: 2px 2px 10px #0F0907;
|
||||
flex: 1 0 auto; }
|
||||
.portfolio-item p {
|
||||
margin: 0;
|
||||
@ -45,10 +45,31 @@
|
||||
|
||||
/* iPhone */
|
||||
@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 {
|
||||
margin: 8px 0 0;
|
||||
width: 256px; }
|
||||
|
||||
#calendar {
|
||||
.technology-list img {
|
||||
width: 100%; }
|
||||
|
||||
#calendar, #calendar-label {
|
||||
display: none; } }
|
||||
.screenshot {
|
||||
margin: 0;
|
||||
@ -58,7 +79,8 @@
|
||||
#calendar {
|
||||
width: 100%;
|
||||
max-width: 1320px;
|
||||
height: 480px; }
|
||||
height: 480px;
|
||||
border: 0; }
|
||||
|
||||
/* Force image on its own line for two-column layout */
|
||||
@media only screen and (min-width: 691px) and (max-width: 1054px) {
|
||||
|
||||
@ -46,7 +46,7 @@
|
||||
text-align: center;
|
||||
background-color: #e8e8e8;
|
||||
color: #000;
|
||||
box-shadow: 4px 4px 6px #000;
|
||||
box-shadow: 2px 2px 10px #0F0907;
|
||||
flex: 1 0 auto;
|
||||
|
||||
p {
|
||||
@ -59,11 +59,38 @@
|
||||
@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 {
|
||||
margin: 8px 0 0;
|
||||
width: 256px;
|
||||
}
|
||||
|
||||
#calendar {
|
||||
.technology-list img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#calendar, #calendar-label {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
@ -78,6 +105,7 @@ and (max-device-width : 568px) {
|
||||
width: 100%;
|
||||
max-width: 1320px;
|
||||
height: 480px;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* Force image on its own line for two-column layout */
|
||||
|
||||
@ -16,7 +16,7 @@ h1, h2, h3, h4 {
|
||||
/* Header */
|
||||
#header {
|
||||
margin: 0;
|
||||
padding: 16px;
|
||||
padding: 16px 0 0;
|
||||
text-align: center;
|
||||
background: #222;
|
||||
color: #0f0;
|
||||
@ -30,16 +30,19 @@ h1, h2, h3, h4 {
|
||||
}
|
||||
|
||||
#tagline {
|
||||
margin: 0;
|
||||
margin: 0 auto;
|
||||
padding: 0 0 8px;
|
||||
font-size: .9em;
|
||||
color: #39e639;
|
||||
color: #72bbfa;
|
||||
border-bottom: 1px solid #fff;
|
||||
width: 304px;
|
||||
}
|
||||
|
||||
|
||||
/* Navigation */
|
||||
#nav {
|
||||
width: 100%;
|
||||
margin: 16px 0 0;
|
||||
margin: 8px 0 0;
|
||||
padding: 0;
|
||||
text-align: center;
|
||||
}
|
||||
@ -52,13 +55,17 @@ h1, h2, h3, h4 {
|
||||
}
|
||||
|
||||
#nav li {
|
||||
/*width: 61px;*/
|
||||
margin: 0;
|
||||
display: inline-block;
|
||||
list-style: none;
|
||||
padding: 0 1em 0;
|
||||
padding: 4px 8px;
|
||||
background-color: #fff;
|
||||
border-radius: 2px 2px 0 0;
|
||||
}
|
||||
|
||||
#nav a {
|
||||
color: #b9f73e;
|
||||
color: #428bca;
|
||||
}
|
||||
|
||||
/* Main body */
|
||||
@ -95,6 +102,7 @@ h1, h2, h3, h4 {
|
||||
margin: 0;
|
||||
padding: .5em;
|
||||
clear: both;
|
||||
background: #fff;
|
||||
background: #222;
|
||||
color: #fff;
|
||||
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="author" content="Ian Adam Naval">
|
||||
<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" />
|
||||
{% block extrastyle %}{% endblock extrastyle %}
|
||||
|
||||
<script src="{{ url_for('static', filename='lib/modernizr.js') }}"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<header id="header">
|
||||
<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">
|
||||
<ul>
|
||||
<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 %}
|
||||
</footer>
|
||||
|
||||
<script src="{{ url_for('static', filename='lib/modernizr.js') }}"></script>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-33981209-1']);
|
||||
@ -49,5 +48,6 @@
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
</body>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
||||
@ -33,56 +33,54 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="portfolio" class="section">
|
||||
<div id="portfolio" class="section center-wrapper">
|
||||
<h2>Portfolio</h2>
|
||||
<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">
|
||||
<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>
|
||||
<p>GNU/Linux mirrors for WPI folk.</p>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<p>Homepage for the WPI ACM chapter.</p>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<p>Helps restore Android texts from Google Voice.</p>
|
||||
</div>
|
||||
|
||||
<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>
|
||||
<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>
|
||||
<a target="_blank" href="http://potatoipsum.com/"><img src="{{ url_for('static', filename='img/potatoipsum.png') }}" alt="Potato Ipsum screenshot" class="screenshot"></a>
|
||||
<h3>Potato Ipsum</h3>
|
||||
<p>Lorem ipsum generator. With potatoes.</p>
|
||||
</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 id="contact" class="section">
|
||||
<div id="contact" class="section center-wrapper">
|
||||
<h2>Contact</h2>
|
||||
<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>
|
||||
|
||||
{% endblock main %}
|
||||
|
||||
@ -4,8 +4,12 @@
|
||||
|
||||
{% block main %}
|
||||
<div class="section">
|
||||
<h2>Labs</h2>
|
||||
<p>Welcome to my lab! This where I run all my experimental stuff.</p>
|
||||
<p>Click <a href="http://demo.ianonavy.com/">here</a> to see what I'm working on this very moment (if anything).</p>
|
||||
<h2>Labs</h2>
|
||||
<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>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>
|
||||
{% endblock main %}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user