1
Fork 0

Remove old Django stuff etc

This commit is contained in:
Jake Howard 2016-05-13 20:55:08 +01:00
parent f02ced64ff
commit 925d1aa7e3
53 changed files with 0 additions and 1236 deletions

3
.gitignore vendored
View file

@ -57,6 +57,3 @@ docs/_build/
# PyBuilder
target/
private/
database.db

View file

@ -1,38 +0,0 @@
# markdown-spellcheck spelling configuration file
# Format - lines beginning # are comments
# global dictionary is at the start, file overrides afterwards
# one word per line, to define a file override use ' - filename'
# where filename is relative to this configuration file
Django
SQLite
eg
MyWindowsHosting
nginx
backends
PyGame
easter
_Enabler
Hipchat
DabApps
JakeSidSmith
facepalm
notsureif
wat
premis
hipchat
plugin
firefox
Jetpack
Javascript
facebook
github
morse
wikipedia
iframe
querystring
javascript
jQuery
gists
Lenovo
Collyer's
til

9
build
View file

@ -14,15 +14,6 @@ set -e
pyvenv env
env/bin/pip install -r requirements.txt --upgrade
scripts/get-private-data.sh
npm install
npm run build $@
env/bin/python manage.py collectstatic --noinput
if [[ $BUILD_PRODUCTION ]]
then
echo ">> Running Migrations..."
env/bin/python manage.py migrate
fi

View file

@ -1,6 +0,0 @@
links:
github: https://github.com/RealOrangeOne
twitter: https://twitter.com/RealOrangeOne
instagram: https://instagram.com/RealOrangeOne
youtube: https://www.youtube.com/user/TheOrangeOneOfficial
reddit: https://www.reddit.com/user/realorangeone

View file

@ -1,9 +0,0 @@
index:
body_class: index
html_title: Homepage
projects/hipchat-emoticons-for-all:
header_image: https://hipchat-magnolia-cdn.atlassian.com/assets/img/hipchat/hipchat_og_image.jpg
projects/yoga-pal:
header_image: http://www.lenovo.com/images/OneWebImages/SubSeries/gallery/laptops/IdeaPad-Yoga-13-Convertible-Laptop-PC-Clementine-Orange-Closed-Cover-View-gallery-940x529.jpg

View file

@ -1 +0,0 @@
college/attack-on-blocks: projects/attack-on-blocks

View file

@ -1,10 +0,0 @@
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)

View file

View file

@ -1,67 +0,0 @@
from django.test import TestCase
import requests_mock, json
from . import utils
from django.core.urlresolvers import reverse
@requests_mock.mock()
class WordPressAPITestCase(TestCase):
def setUp(self):
self.test_blog_data = {
"title": "Test Blog Post",
"ID": 1,
"content": "<p>Test blog post content</p>",
"slug": "test-post"
}
self.invalid_blog_data = {
"title": "Invalid blog post",
"content": "<p></p>",
"slug": "invalid"
}
def test_gets_correct_data(self, m):
payload = json.dumps(self.test_blog_data)
m.get(utils.build_url(self.test_blog_data['slug']), text=payload)
blog_data = utils.get_post(self.test_blog_data['slug'])
self.assertEqual(blog_data, self.test_blog_data)
def test_invalid_response(self, m):
payload = json.dumps(self.invalid_blog_data)
m.get(utils.build_url(self.invalid_blog_data['slug']), text=payload)
blog_data = utils.get_post(self.invalid_blog_data['slug'])
self.assertFalse(blog_data)
def test_invalid_status(self, m):
payload = json.dumps(self.test_blog_data)
m.get(utils.build_url(self.test_blog_data['slug']), text=payload, status_code=500)
blog_data = utils.get_post(self.test_blog_data['slug'])
self.assertFalse(blog_data)
def test_no_slug(self, m):
blog_data = utils.get_post('')
self.assertFalse(blog_data)
@requests_mock.mock()
class BlogViewTestCase(TestCase):
def setUp(self):
self.test_blog_data = {
"title": "Test Blog Post",
"ID": 1,
"content": "<p>Test blog post content</p>",
"slug": "test-post",
"date": "2000-01-01T18:05:00+00:00"
}
def test_accessable(self, m):
payload = json.dumps(self.test_blog_data)
m.get(utils.build_url(self.test_blog_data['slug']), text=payload)
response = self.client.get(reverse('blog:blog-post', args=[self.test_blog_data['slug']]))
self.assertEqual(response.status_code, 200)
def test_correct_content(self, m):
payload = json.dumps(self.test_blog_data)
m.get(utils.build_url(self.test_blog_data['slug']), text=payload)
response = self.client.get(reverse('blog:blog-post', args=[self.test_blog_data['slug']]))
self.assertContains(response, self.test_blog_data['content'])
self.assertEqual(response.context['html_title'], self.test_blog_data['title'])

View file

@ -1,6 +0,0 @@
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^(?P<slug>.+)/?$', views.BlogView.as_view(), name='blog-post'),
]

View file

@ -1,25 +0,0 @@
import requests, iso8601
from django.conf import settings
API_PATH = "https://public-api.wordpress.com/rest/v1.1/sites/{0}/posts/slug:{1}"
def build_url(slug):
if not slug:
return
return API_PATH.format(settings.WORDPRESS_URL, slug)
def get_post(slug):
if not slug:
return
response = requests.get(build_url(slug))
if response.status_code != 200:
return
data = response.json()
return data if "ID" in data else False
def reformat_date(iso_date):
return iso8601.parse_date(iso_date).strftime("%x %I:%M")

View file

@ -1,22 +0,0 @@
from django.views.generic import TemplateView
from .utils import get_post, reformat_date
from django.http import Http404
class BlogView(TemplateView):
template_name = "blog/post.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['blog'] = self.blog_data
context['blog']['date'] = reformat_date(self.blog_data['date'])
context['html_title'] = self.blog_data['title']
if 'featured_image' in self.blog_data:
context['header_image'] = self.blog_data['featured_image']
return context
def dispatch(self, request, *args, **kwargs):
self.blog_data = get_post(kwargs['slug'])
if not self.blog_data:
raise Http404
return super().dispatch(request, *args, **kwargs)

View file

@ -1,46 +0,0 @@
import os.path
import yaml
from glob import glob
from project.pages.utils import get_title_from_markdown, parse_content
def get_data_from_file(base_dir, filename):
with open(os.path.join(base_dir, 'data', filename)) as data_file:
return yaml.load(data_file) or {}
def generate_config(base_dir):
default = get_data_from_file(base_dir, 'context.yml')
page = get_data_from_file(base_dir, 'page_context.yml')
switcher = get_data_from_file(base_dir, 'path_switch.yml')
# Add projects config
default['projects'] = generate_projects(base_dir)
# Join projects config with it's page context
for i in range(len(default['projects'])):
project = default['projects'][i]
if project['path'] in page: # If there's a custom config
default['projects'][i] = dict(project, **page[project['path']])
return default, page, switcher
def generate_projects(base_dir):
projects_path = os.path.join(base_dir, 'templates/projects')
files = []
for path in glob(projects_path + '/*.*'):
filename = path.replace(projects_path, '')
if filename == '/index.html':
continue
with open(path) as f:
if filename.split('.')[1] == 'md':
parsed_content = parse_content(f.read(), filename.split('.')[1])
filename = get_title_from_markdown(parsed_content)
else:
filename = filename.split('.')[0]
files.append({
"name": filename,
"path": 'projects' + path.replace(projects_path, '').split('.')[0],
"url": '/projects' + path.replace(projects_path, '').split('.')[0],
})
return files

View file

@ -1,19 +0,0 @@
from django.test import TestCase
from django.conf import settings
import os.path
from glob import glob
class PagesTestCase(TestCase):
def setUp(self):
directories = glob(os.path.join(settings.BASE_DIR, 'templates') + '/**/*.*')
self.urls = []
for directory in directories:
if 'email' in directory or 'blog' in directory:
continue
self.urls.append(directory.replace(os.path.join(settings.BASE_DIR, 'templates'), '').split('.')[0].replace('index', ''))
def test_pages_accessable(self):
for path in self.urls:
response = self.client.get(path)
self.assertEqual(response.status_code, 200)

View file

@ -1,7 +0,0 @@
from django.conf.urls import url
from .views import page_view
urlpatterns = [
url(r'^(?P<path>.*)', page_view, name='page'),
]

View file

@ -1,29 +0,0 @@
from django.conf import settings
from bs4 import BeautifulSoup
import markdown2
def get_context(path):
if path in settings.PAGE_CONTEXT:
context = dict(settings.DEFAULT_CONTEXT, **settings.PAGE_CONTEXT[path])
else:
context = dict(settings.DEFAULT_CONTEXT)
return context
def get_title_from_markdown(md):
html_tree = BeautifulSoup(md, "html.parser")
tag = html_tree.find('h1')
return tag.contents[0]
def parse_content(content, extension):
if extension == 'md':
return markdown2.markdown(content)
return content
def swap_page(path):
if path in settings.PAGE_SWITCH:
return settings.PAGE_SWITCH[path]
return path

View file

@ -1,33 +0,0 @@
import os.path
from django.conf import settings
from django.http import HttpResponse, Http404
from django.template.loader import get_template
from .utils import get_context, parse_content, get_title_from_markdown, swap_page
def page_view(request, path):
template = None
if path.endswith('/'): # Strip trailing slash
path = path[:-1]
path = swap_page(path)
if os.path.isdir(os.path.join(settings.BASE_DIR, 'templates', path)):
path = os.path.join(path, 'index')
for extension in ['md', 'html']:
try:
template = get_template("{}.{}".format(path, extension))
break
except:
pass
if not template:
raise Http404
context = get_context(path)
parsed_content = parse_content(template.render(context, request), extension)
if extension == 'md':
template = get_template('markdown_content.html')
context['markdown_content'] = parsed_content
context['page_title'] = get_title_from_markdown(parsed_content)
context['html_title'] = context['page_title']
parsed_content = template.render(context, request)
return HttpResponse(parsed_content)

View file

@ -1,90 +0,0 @@
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import dj_database_url, os
from private import export
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = export('SECRET_KEY')
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ['too.ctf.sh', 'theorangeone.net']
# Application definition
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.staticfiles',
'project.pages',
'project.common',
'project.blog'
)
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.middleware.security.SecurityMiddleware',
)
ROOT_URLCONF = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases
DATABASES = {
'default': dj_database_url.config(default='sqlite://memory')
}
EMAIL_BACKEND = os.environ['EMAIL_BACKEND']
# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/
LANGUAGE_CODE = 'en-gb'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'collected-static')
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static', 'build'),
)
WORDPRESS_URL = "realorangeone.wordpress.com"
# Generate config data
from project.common.data import generate_config
DEFAULT_CONTEXT, PAGE_CONTEXT, PAGE_SWITCH = generate_config(BASE_DIR)

View file

@ -1,7 +0,0 @@
from django.conf.urls import include, url
urlpatterns = [
url(r'^blog/', include('project.blog.urls', namespace='blog')),
url(r'', include('project.pages.urls', namespace='pages'))
]

View file

@ -1,8 +0,0 @@
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise
application = get_wsgi_application()
application = DjangoWhiteNoise(application)

View file

@ -1,13 +1,3 @@
beautifulsoup4==4.4.1
coverage==4.0.3
colorama==0.3.6
Django==1.8.11
dj-database-url==0.3.0
flake8==2.5.0
iso8601==0.1.11
markdown2==2.3.0
PyYAML==3.11
requests==2.9.1
requests-mock==0.7.0
whitenoise==2.0.6
waitress==0.8.10

View file

@ -1,15 +0,0 @@
#!/usr/bin/env bash
set -e
echo ">> Removing VirtualEnv..."
rm -rf env/
echo ">> Removing Node Modules..."
rm -rf node_modules/
echo ">> Removing Static Build Directory..."
rm -rf static/build/
echo "> Cleaning Complete."

View file

@ -1,24 +0,0 @@
#!/usr/bin/env bash
set -e
echo ">> Removing VirtualEnv..."
rm -rf env/
echo ">> Removing Collected Static Files..."
rm -rf collected-static/
echo ">> Removing Private Data..."
rm -rf private/
echo ">> Removing Node Modules..."
rm -rf node_modules/
echo ">> Removing Static Build Directory..."
rm -rf static/build/
echo ">> Removing Stray Files and Folders..."
rm -rf htmlcov/ .coverage
echo "> Much Fresher!"

View file

@ -1,9 +0,0 @@
#!/usr/bin/env bash
set -e
echo ">> Removing old Private Data..."
rm -rf private/
echo ">> Getting Private Data..."
git clone git@bitbucket.org:TheOrangeOne/theorangeone.net-site-private-data.git --branch master --single-branch private/

View file

@ -1,41 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}About all the things{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-sm-6">
<div class="thumbnail">
<p class="center-text mega-icon">
<span class="glyphicon glyphicon-hdd" aria-hidden="true"></span>
</p>
<div class="caption">
<h3>About Website</h3>
<p>
Some info about my website, which clearly works well as you're using it right now!
</p>
<p>
<a href="/about/website/" class="btn btn-primary btn-block">More Info</a>
</p>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="thumbnail">
<p class="center-text mega-icon">
<span class="glyphicon glyphicon-user" aria-hidden="true"></span>
</p>
<div class="caption">
<h3>About Me</h3>
<p>
Some info about me. Although not very much. Because Privacy!
</p>
<p>
<a href="/about/me/" class="btn btn-primary btn-block">More Info</a>
</p>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,19 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}About Me{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-sm-8">
<p>Stuff</p>
</div>
<div class="col-sm-4 gh-card">
<div data-theme="medium" data-github="RealOrangeOne" class="github-card"></div>
</div>
</div>
</div>
<script async defer src="//cdn.jsdelivr.net/github-cards/latest/widget.js"></script>
{% endblock %}

View file

@ -1,14 +0,0 @@
# About my website
My website is the culmination of all my knowledge, compiled into 1 place. It not only contains all my projects, but it in itself is a project. Making sure this website works properly is a tall order, especially considering it's self hosted.
## The Website
The website itself is written in python, using the Django framework, and a SQLite database. For what I need it's more than overkill, but hey, why not!
I went with the Django framework because it's what I use with at work, as well as the fact it's simple, clean and easy. It also allows for some server side assets, eg blogging.
The only reason I have a database is because certain sections require it. For this reason I went with SQLite, because it's really lightweight and simple.
## The server
The website is hosted on my UK VPS. Previous versions have been hosted on 1&1 and MyWindowsHosting.
The Django application itself is served using waitress. This get's it's port from a custom reverse proxy allowing me to host multiple sites on a single server easily. This is the same one I use for local development. The main web-facing server is nginx, because it's simple to setup, and damn fast!

View file

@ -1,63 +0,0 @@
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
<title>{{ html_title }} | TheOrangeOne</title>
<meta chatset='utf-8' />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
<script type="text/javascript" src="{% static 'js/jquery.js' %}"></script>
<link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"/>
<link rel="shortcut icon" href=""/>
</head>
<body class="{{ body_class }}">
<div class="content-wrapper">
{% block baseContent%}{% endblock %}
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-xs-12">
<p class="social">
<a href="{{ links.twitter }}"><i class="icon ion-social-twitter"></i></a>
<a href="{{ links.instagram }}"><i class="icon ion-social-instagram-outline"></i></a>
<a href="{{ links.reddit }}"><i class="icon ion-social-reddit"></i></a>
<a href="{{ links.youtube }}"><i class="icon ion-social-youtube"></i></a>
<a href="soon"><i class="icon ion-social-codepen"></i></a>
<a href="soon"><i class="icon ion-social-twitch-outline"></i></a>
<a href="{{ links.github }}"><i class="icon ion-social-octocat"></i></a>
</p>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<p class="bar-links">
<a href="/about/">About</a> |
<a href="{{ links.github }}/theorangeone.net" target="_blank">View Source</a>
<p>
</div>
</div>
<div class="row">
<div class="col-xs-12 powered-by">
<p>Powered by <a href="https://www.djangoproject.com/">Django</a>, <a href="https://clients.inceptionhosting.com/aff.php?aff=256">Inception Hosting</a>, and a whole heap of <a href="https://github.com/RealOrangeOne/theorangeone.net">Magic</a>!</p>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<a href="https://circleci.com/gh/RealOrangeOne/theorangeone.net" target="_blank">
<img class="ci-badge" src="https://circleci.com/gh/RealOrangeOne/theorangeone.net.svg?style=svg"/>
</a>
</div>
</div>
</div>
</footer>
<script type="text/javascript" src="{% static 'js/libs.js' %}"></script>
<script type="text/javascript" src="{% static 'js/app.js' %}"></script>
{% if js_redirect %}
<noscript>
<style> html, body { display:none; }</style>
<meta http-equiv="refresh" content="0.0;url=/no-js">
</noscript>
{% endif %}
</body>
</html>

View file

@ -1,18 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}{{ html_title }}{% endblock %}
{% block content %}
<div class="container">
<div class="row">
<div class="col-sm-9">
{{ blog.content | safe }}
</div>
<div class="col-sm-3">
<h5>Published: {{ blog.date }}</h5>
<h5><i class="icon ion-thumbsup"></i> {{ blog.like_count }}</h5>
<h5><a href="{{ blog.URL }}">View Post</a></h5>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,15 +0,0 @@
# Student Server
Back when I was in college, we needed a server for computing students to learn how to use FTP, and script on a server using python CGI and [PHP](http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/#an-analogy), as well as possibly for some students coursework. Fortunately, the college already had one, running the IT students microsite for extra course information. The problem was that it was majorly out of date, and no one really new how to use it properly. It was up to me and my friend Alex to bring the server up to date, and get it ready for the students who needed it.
The original plan was to update the server's OS (at that stage running Ubuntu 12.04 LTS), install python and [PHP](http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/#an-analogy) backends, add student users, and then make sure they couldn't edit each others documents. In the end, because we had no idea how the server worked, because it was setup a long time ago, we decided it was just easier to backup what we needed, then do a complete fresh install. Meaning we could set things up exactly how we wanted them, and install the tools we needed.
## User Creation
I knew we would need user accounts for all the computing teachers, the students doing A2 computing. I wasn't expecting this to amount to over 50 user accounts that needed to be created, and permissions setup for their accounts. Fortunately Alex had started writing a basic script for this, which I quickly modified.
The basis of the script was to load information about the users from a database I had created (by hand) with all the required students in, create users based on this information, and configure the permissions for the user and their home directory. The script also allowed for manual entering of users with the same permission template, in case single users needed to be created. An additional feature that I added which has proved useful now that I've left is the ability to delete users manually, and from that original database, to make sure that no student will have access to the server once they have left, well, other than me that is!
### The script
Because a lot of the accounts are still active, and that new user accounts are being created in the same way the exact script cannot be shown, for security reasons.
## What next?
Now that I've left college, I've passed on the server to other people, although I do still have an account. From what I hear, fewer students are using the server. However, they have made the microsite look infinitely better!

View file

@ -1,21 +0,0 @@
{% extends 'base.html' %}
{% block baseBodyClass %}
{% block bodyClass %}{% endblock %}
{% endblock%}
{% block baseContent %}
<div class="jumbotron header">
<div class="container">
<h1>{% block pageTitle %}{% endblock %}</h1>
{% block header_image %}
{% if header_image %}
<div class="image" style="background-image: url({{ header_image }});"></div>
{% endif %}
{% endblock %}
<div id="breadcrumbs"></div>
</div>
<navbar></navbar>
</div>
{% block content %}{% endblock %}
{% endblock %}

View file

@ -1,23 +0,0 @@
{% extends 'base.html' %}
{% block htmltitle %}404 - It's not here!{% endblock %}
{% block bodyClass %}four-o-four{% endblock %}
{% block content %}
<div class="container header">
<h1>Uh Oh - There's nothing here!</h1>
</div>
<div class="container-fluid image"></div>
<div class="container-fluid message">
<div class="container">
<h3>The page you were looking for could not be found.</h3>
<h4>Don't worry, I've send these badass tech ninjas to go and find it. Rest assured it will be found.</h4>
</div>
</div>
<div class="container-fluid move-on">
<div class="container">
<h4>Nope, there's nothing more down here either. Why not <a href="javascript:window.history.back()">Go back</a> or <a href="/">Return Home</a></h4>
</div>
</div>
{% endblock %}

View file

@ -1,73 +0,0 @@
{% extends 'base.html' %}
{% load staticfiles %}
{% block htmltitle %}Javascript is Disabled!{% endblock %}
{% block bodyClass %}no-js{% endblock %}
{% block content %}
<div class="jumbotron header">
<div class="container">
<h1>You have Javascript is disabled!</h1>
</div>
</div>
<div class="container message">
<p>
You appear to have javascript disabled. For my site to function properly, javascript must be enabled! The javascript is used to dynamically change the webpage on your device. Without them then the site will break, cause a tonne of errors, and not look right, all of which aren't very nice, for you or me.
</p>
<p>
The javascript on this page won't damage your computer in any way, and has been written entirely by me, or has used trusted and open-source 3rd-party libraries. You can trust this site! Re-enabling the javascript functions inside your browser is very easy, and helpful tutorials can be found below!
</p>
</div>
<div class="container">
<h2>Re-enabling Javascript in your browser</h2>
<div class="panel panel-primary" id="enable-firefox">
<div class="panel-heading">
<h3 class="panel-title">Re-enabling in Firefox</h3>
</div>
<div class="panel-body">
<ol>
<li>Navigate to 'about:config', using the browsers address bar.</li>
<li>Accept the security warning, and notice that no dragons lie ahead.</li>
<li>In the search bar, enter 'javascript'</li>
<li>Find the entry 'Javascript.enabled' (possibly using <kbd>ctrl + F</kbd>)</li>
<li>Toggle the entry by either double-clicking the entry, or right-clicking and selecting 'Toggle'.</li>
</ol>
</div>
</div>
<div class="panel panel-success" id="enable-chrome">
<div class="panel-heading">
<h3 class="panel-title">Re-enabling in Chrome</h3>
</div>
<div class="panel-body">
<ol>
<li>Click the Chrome menu icon (<i class="icon ion-navicon-round"></i>) in the top right hand corder of the window.</li>
<li>Click 'Settings'.</li>
<li>Under the 'Privacy' section, select 'Content settings'.</li>
<li>Under 'Javascript', select 'Allow all sites to run Javascript(Recommended)'.</li>
</ol>
</div>
</div>
<div class="panel panel-info" id="enable-ie">
<div class="panel-heading">
<h3 class="panel-title">Re-enabling in Internet Explorer</h3>
</div>
<div class="panel-body">
<img src="{% static 'img/projects/IE-scare.png' %}" id="ie-scare"/>
<ol>
<li>Select the gear icon in the top right hand corner <i class="icon ion-ios-gear"></i>, and click 'Internet Options'.</li>
<li>Select Security > Internet > Custom Level.</li>
<li>Scroll down until you find 'Scripting', and select 'Enable'</li>
</ol>
<p>
<strong>Also: </strong> If you are using Internet Explorer (Or Microsoft Edge for that matter), <stong>Stop!</stong> Use one of the other ones. They're much faster, and better, especially <a href="//firefox.com">Firefox</a>!
</p>
</div>
</div>
</div>
<div class="container">
<h5>
After enabling javascript, the page should automatically redirect to the homepage. If it doesn't, just refresh the page, or <a href="{% url 'pages:index'%}">Click here</a> to return home.
</h5>
</div>
<script>window.location.href=location.href.replace("{% url 'pages:no-js' %}", '');</script>
{% endblock%}

View file

@ -1,11 +0,0 @@
{% block subject %}
{% block subjectcontent %}{% endblock %}
{% endblock %}
{% block body %}
{% block bodycontent %}{% endblock %}
{% endblock %}
{% block html %}
{% block htmlcontent %}{% endblock %}
{% endblock %}

View file

@ -1,15 +0,0 @@
{% extends 'email/base.html' %}
{% block subjectcontent %}Message from {{ name }}{% endblock %}
{% block bodycontent %}
You have recieved a message from {{ name }}.
The message reads:
{{ message }}
{% endblock %}
{% block htmlcontent %}
<p>You have recieved a message from {{ name }}.</p>
<p>The message reads:</p>
<blockquote>{{ message }}</blockquote>
{% endblock %}

View file

@ -1,74 +0,0 @@
{% extends 'base.html' %}
{% load staticfiles %}
{% block baseContent%}
<div class="container-fluid" id="header">
<div class="jumbotron container animated zoomInDown">
<img src="{% static 'img/logo-transparent.png'%}"/>
<h1>Hello world!</h1>
<p>Welcome to my website</p>
<p class="scroll-icon"><a href="#intro-text" class="no-color-change"><i class="icon ion-chevron-down"></i></a></p>
</div>
</div>
<div class="container-fluid" id="intro-text">
<div class="container">
<p>Bacon ipsum dolor amet pork chop biltong venison pork belly, pig meatball kevin cow ham pancetta pork fatback doner flank. Flank turducken swine leberkas andouille, tongue ball tip cow chicken ham hock sausage. Ball tip swine tri-tip salami turkey beef ribs doner pancetta shankle pork chop prosciutto. Spare ribs biltong pork loin, flank beef leberkas ribeye t-bone alcatra ball tip. Pork rump sausage capicola, beef ribs pancetta drumstick doner. Kielbasa fatback turducken turkey jowl strip steak. Landjaeger andouille t-bone, bacon cupim prosciutto short ribs.</p>
<p>Doner turducken bacon tail ham hock. Cow corned beef shankle pork chop frankfurter turducken. Pig ball tip tri-tip, meatloaf filet mignon cow andouille cupim swine pork corned beef sausage spare ribs chuck. Beef jowl bacon shank capicola. Kevin turkey ground round pork loin t-bone. Tri-tip turducken ham, short ribs prosciutto kevin pork loin fatback doner pig kielbasa tenderloin.</p>
</div>
</div>
<div class="container-fluid" id="twitter-feed">
<div class="container">
<div class="row">
<div class="col-sm-6 col-xs-12 feed">
<h5>Twitter widget broken - repair coming soon!</h5>
</div>
<div class="col-sm-6 twitter-icon hidden-xs">
<a href="https://twitter.com/RealOrangeOne" class="no-color-change">
<i class="icon ion-social-twitter"></i>
</a>
</div>
</div>
</div>
</div>
<navbar></navbar>
<div class="container-fluid" id="project-thumbnails">
<div class="container">
<div class="row">
<h1>All Projects</h1>
{% for project in projects %}
<div class="col-sm-6 col-md-4">
{% if project.header_image %}
<div class="thumbnail">
<img src="{{ project.header_image }}" alt="image">
<div class="caption">
<h3>{{ project.name }}</h3>
<a href="{{ project.url }}">
Read More
</a>
</div>
</div>
{% else %}
<div class="thumbnail larger project">
<div class="inner">
<h2>{{ project.name }}</h2>
<a href="{{ project.url }}">
Read More
</a>
</div>
</div>
{% endif %}
</div>
{% endfor %}
<div class="col-sm-6 col-md-4">
<div class="thumbnail larger">
<div class="inner">
<a href="/projects/">
<h1>See All</h1>
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,9 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}{{ page_title }}{% endblock %}
{% block content %}
<div class="container markdown-content">
{{ markdown_content | safe }}
</div>
{% endblock %}

View file

@ -1,18 +0,0 @@
# Attack on Blocks Game!
Attack on Blocks is a space invaders style game that I wrote for my IT coursework, for the games development unit. We were allowed to make any game that we wanted, provided it could be done within the time limits, be very easy to play, and easily run on the college computer (which were pretty terrible). I had never written a game before, so I knew this was going to be a challenge.
I decided to write the game in Python, seeing as there were other people in the class that could help me bug report and test features, and because it was easy to run on the college computers. I used PyGame for the graphics library, even though I had never used it before, because it was really simple to use, and there was a lot of support and documentation online.
## Easter Eggs
One of the key features of this take on space invaders (and unfortunately the thing I spent the most time on), is the easter eggs. There are a few dotted around the game, which make the game either much easier, or way more fun! At the moment, there are 3 main easter eggs, the first enabling the other 2. If you would like to know what they are, click the button below. If not, pay the game and try and find them, or search through the source to find them (it's not too hard through the source).
As you will see (If and when you find the easter eggs), most of them are completely useless, and completely unrelated to the game or anything else. The main reason they were put in was because I'm friends with people that pester to the point it's just easier to give in. Hence there are some really very odd ones!
<div class="btn-group btn-group-justified">
<p class="center-text">
<a class="btn btn-primary btn-lg" href="https://github.com/RealOrangeOne/attack-on-blocks/archive/master.zip" download="Attack-on-blocks.zip">Download Attack on Blocks</a>
<a class="btn btn-default btn-lg" href="https://github.com/RealOrangeOne/attack-on-blocks">View on Github <i class="icon ion-social-github"></i></a>
</p>
</div>

View file

@ -1,19 +0,0 @@
# BSOD Enabler
For those that use Windows, the famous [Blue Screen of Death](https://en.wikipedia.org/wiki/Blue_Screen_of_Death) is an annoyance that plagues computers, causing error, frustration, and even data loss. They happened to me a lot whilst I was trying to configure my computer, and I thought _I wonder who else I can annoy with a BSOD_
__And thus the BSOD_Enabler was born!__
After researching into it for a while, it turns out that there are a few different ways to cause a BSOD, unfortunately most of which are by doing things that are meant to cause a BSOD, and can therefore be dangerous to a computer, something I didn't really want. Then I stumbled upon [this article](http://www.wikihow.com/Force-a-Blue-Screen-in-Windows), which shows that you can in fact raise a BSOD without causing any errors or damage to your computer. Now to write a program that can do it too!
Obviously there are many different ways, and probably far better ways of doing this, but I wanted something that was simple to use, fast, and could be done by anyone, no matter how technically illiterate. So I decided to write it in C#, and use a windows console interface.
Below you can find a download link to the application, as well as a link to the source code. I am hoping to upgrade the project in the future to allow for automated triggering, a much faster UI, with options, as well as a simple one-click setup and BSOD.
<div class="btn-group btn-group-justified">
<p class="center-text">
<a class="btn btn-primary btn-lg" href="" download="BSOD_Enabler.exe">Download BSOD Enabler Here</a>
<a class="btn btn-default btn-lg" href="javascript:alert('Coming in next version.');">View on Github <i class="icon ion-social-github"></i></a>
</p>
</div>

View file

@ -1,14 +0,0 @@
# My Dotfiles
### What are dotfiles?
Dotfiles are a way for people to store their settings and preferences to make setting up a new computer that much easier. They can usually be found in a persons VCS profile.
### Taking dotfiles 1 step further
I use both my laptop and work machines almost every day, and want them to be setup in an almost identical way, despite the fact that 1 runs Ubuntu, and the other runs Arch. The main things I needed synced over were my `.bashrc` file and my atom config.
## How I did it
Originally, I used my owncloud server to sync all my dotfiles between my computer, and then used symlinks to split out the relevant files into the relevant locations.
This worked brilliantly, config files were automatically synced as soon as I made a change. This was especially great for my `.bashrc` file! The main problem was with atom packages, I had to manually store what files were installed, then manually install them on the other machine from the saved file. This was made easier by `apm` allowing me to list them and automatically save them in a file, but it wasnt perfect.
Eventually, after looking into possible solutions, I came across the [`Sync settings`](https://atom.io/packages/sync-settings) package, which seemed to be the answer to my prayers! It saved all my config data for atom into a gist, which I could then backup and restore too from within the application. It also warned me when my local data was out of date from the remote, and prompt me to downnload the updated data.

View file

@ -1,17 +0,0 @@
# Hipchat Emoticons for All
After starting my new job at DabApps, I was introduced to the world of [Hipchat](https://hipchat.com), and it's wonderful array of emoticons, as well as the ones added. It was wonderful, it made communicating with friends and colleagues much more interesting!
Unfortunately, the emoticons on the other services we use, like [GitHub](https://github.com), were terrible in comparison. So it was after a discussion with [@JakeSidSmith](https://github.com/jakesidsmith) about him just using things like (facepalm), (notsureif), and (wat) in [Facebook messenger](https://www.messenger.com/) and hoping people understand what it means, that I decided to make 'Hipchat Emoticons for all', so people like him could use a much better set of emoticons.
The premis is very simple, whenever it sees a hipchat emoticon code, like (notsureif), it replaces it with an emoticon. If only writing the code could have been this simple! I started writing the plugin in firefox, using [Jetpack](https://wiki.mozilla.org/Jetpack), which uses Javascript. The initial stages of the code were very simple, but I encountered problems making sure that anything loaded after the page was loaded (such as a facebook message), be changed too.
Fortunately after many hours of testing, and changing the code, I finally got everything working perfectly, and in a way that made adding new sites incredibly easy! The code isn't the greatest in terms of performance, and there are some things that could have obviously been done better, but this was all done to help with a shared codebase between Chrome and Firefox, which don't play nice when it comes to extensions.
Currently the application is in very beta stages right now, only having tested partial support for github, but the code is all available on GitHub, if people have their own suggestions of improvements.
<div class="btn-group btn-group-justified">
<p class="center-text">
<a class="btn btn-default btn-lg" href="https://github.com/RealOrangeOne/hipchat-emoticons-for-all">View on Github <i class="icon ion-social-github"></i></a>
</p>
</div>

View file

@ -1,17 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}All Projects{% endblock %}
{% block content %}
<div class="row">
<div class="container all-projects">
{% for project in projects %}
<div class="">
<img src="{{ project.header_image }}">
<h4>{{ project.name }}</h4>
<a href="{{ project.url }}">Read More</a>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View file

@ -1,15 +0,0 @@
# Morse Code Decoder
It's not often someone will need to decode text into morse code (and visa-versa), but if I had something like this when I needed it, it would have saved me hours of time!
I originally wrote this code for the [Student Robotics 2015](/robotics/2015/) Entry, to convert a string message into a morse code message that would be transmitted using LEDs, for aesthetics and debugging. Unfortunately due to a fixed time frame, this idea was scraped before it could be fully implemented. Fortunately the decoder worked perfectly!
## Usage
In order to make it accessible for as many people in as many different languages as possible, the data is in JSON format. Just find a JSON library for your desired language, and it'll work perfectly!
The source of the library is on github as a gist. I recommend downloading the file to use yourself, however for testing you can use github's raw view as a hotlink.
<script src="https://gist.github.com/RealOrangeOne/6dc94875c93b787e5834.js"></script>

View file

@ -1,26 +0,0 @@
# Wiki Game Solver
For those who don't know what the Wiki Game is: [The Wiki Game](http://thewikigame.com) is an online game where you attempt to navigate through wikipedia from a start page to a goal page using as few other pages as possible. Once I was shown the Wiki Game by my friend, and after I realised that I really wasn't very good at it, I looked into how the system worked, and how I could beat it.
I couldn't see how the back end worked, but after playing a few games and checking what happened on the page,the way that the game was won was when the iframe was at the final page location, or at least a clone of it on their servers with extra querystring information.
With this information, I started to write some javascript that would change the location of the iframe to the goal. Fortunately for me, there was already a link to the real winning page, so I could use that to construct the final URL, and direct the iframe to it, meaning I was able to win the game in 1 turn.
## Source
Naturally, the source for this was written in javascript, and relies heavily on the fact that the wiki game uses jQuery so I can plug into components and events really easily. The code can be found in the GitHub gists below. Both the standard and compact versions are available.
<script src="https://gist.github.com/RealOrangeOne/7da9a3dd1bf90ecdf7be.js"></script>
## Usage
1. Start a new game on [Wiki Game](http://thewikigame.com/speed-race), __don't__ press start!
2. Open your browser's developers console. This will vary from browser.
3. Open the Javascript console
4. Paste the compact version of the code there, and execute it (press enter)
5. Congratulations, you just won!
If you want to win more games, just re-paste the code, it works as often as you like!
### Disclaimer
As I experienced whilst developing this, the people that play Wiki Game don't tend to like people cheating. There were a lot of people getting very annoyed whilst I was developing and testing. So please use this at your own risk! At the moment I don't think there is any kind of banning system, but be warned!

View file

@ -1,13 +0,0 @@
# Yoga Pal
Once I started work, I bought myself a _Lenovo Yoga 3 14"_ laptop, because I needed a thin and light for trains etc. Unfortunately this came with windows, which within 10 minutes was running Ubuntu Gnome! Ubuntu greatly increased the performance, but I had to sacrifice all the screen, touchpad and keyboard customisation when changing 'modes'.
I found [this thread](askubuntu.com/questions/450066/rotate-touchscreen-and-disable-the-touchpad-on-yoga-2-pro-in-rotated-mode) on _Ask Ubuntu_ with someone else trying to find a solution to this, to find a nice way of rotating the screen when in tablet mode. On the thread was a really nice simple [script](http://askubuntu.com/a/485685/432138) that rotated the screen perfectly, and did the touchscreen too. This script worked great, doing exactly what it said it did, nicely and quickly, however it wasn't a great solution for me. Yes it worked, but it didn't allow me to change anything else, like the touchpad.
So I started working on my own CLI, based off the above script, to allow me to tweak everything, so the laptop can be used as it was intended.
<div class="btn-group btn-group-justified">
<p class="center-text">
<a class="btn btn-default btn-lg" href="https://github.com/RealOrangeOne/yoga-pal">View on Github <i class="icon ion-social-github"></i></a>
</p>
</div>

View file

@ -1,38 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}Student Robotics 2014{% endblock %}
{% block header_image %}<div class="image" style="background-image: url(https://farm9.staticflickr.com/8806/17113612128_0f51767744_k_d.jpg);"></div>{% endblock %}
{% block content%}
<div class="container">
<div class="row">
<div class="col-sm-4">
<img class="img-rounded" src="https://c2.staticflickr.com/8/7670/17115168179_1ef30ac6e9_b.jpg" />
</div>
<div class="col-sm-8">
<p>Welcome to the homepage of Collyer's Student Robotics 2014 team. Originally, this page was a part of the competition, but due to 3 different site rewrites, the original content and formatting has been lost.</p>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-8">
<h2>The Competition</h2>
<p>The game for this year was called <em>Slots</em>. Teams compeated to get as many of their tokens into a scoring zone in 3 minutes. Teams would also get extra points if they could get the token into a zones 'slot', an area the size of a token, raised by around 3 cm. </p>
<p>To see a copy of the rules from the competition, <a href="https://www.studentrobotics.org/resources/2014/rulebook.pdf">Click Here!</a></p>
</div>
<div class="col-sm-4">
<div class="list-group">
<a class="list-group-item active h4">Quick Links</a>
<a href="https://github.com/SR-CLY/2014" class="list-group-item">The Code</a>
<a href="https://www.flickr.com/photos/theorangeone/albums/72157651820386449" class="list-group-item">Gallery</a>
<a href="http://collyers-robotics14.tumblr.com/" class="list-group-item">Blog</a>
<a href="https://www.studentrobotics.org/schools/game#2014" class="list-group-item">Competition Information</a>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -1,21 +0,0 @@
# The Code | SR2015
The code used for this competition was by far the most complicated and advanced code that had ever been written by a Collyer's team.
The main change between any other year was using an entirely co-ordinate based movement system. Any input taken in from the camera was converted to co-ordinates in terms of the arena, so we could plot our movement more accurately and allow for any immovable objects such as the internal walls.
The addition of this coordinate system allowed us to create the killer feature of this year, the position correction code. This code allowed us to automatically correct our position after we scanned for a marker, meaning we could allow for any imperfections in the build.
There were a lot of really great features in this years code, that made our robot function much faster:
- Position correction
- co-ordinate based movement
- Arc movement
- Distance based movement
- _move 'til touch_
- Camera rotation
### So, where is this code?
Unfortunately, due to the number of features, we have decided to keep the source private, so that only other Collyer's teams may access it. A lot of blood, sweat and tears (not literally) went into writing this code, and it would be a shame if that were to be used to help any of our opponents.
You can however see the code from our other years on our [GitHub organisation](https://github.com/SR-CLY).

View file

@ -1,38 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}Student Robotics 2015{% endblock %}
{% block content%}
<div class="container">
<div class="row">
<div class="col-sm-4">
<img class="img-rounded" src="https://c2.staticflickr.com/8/7726/17309695331_584e7de16c_z.jpg" />
</div>
<div class="col-sm-8">
<p>Welcome to the homepage of Collyer's Student Robotics Team 2015 (The 'A' Team) - Creators of 'A.L.I.C.E'! Here you can see everything that goes on throughout the competition.</p>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-sm-8">
<h2>The Competition</h2>
<p>As was announced at kickstart, the game for this year is a take on the classic gamemode Capture the Flag. 4 teams compete over 5 flags to move as many of them as they can into their scoring zones. The person with the most flags in their scoring zone wins.</p>
<p>The 'flags' are 25cm cubes of wood on caster wheels weighing roughly 2kg. The rules prevent us from lifting them, so the idea is to drag them around!</p>
<p>To see a copy of the rules from the competition, <a href="https://www.studentrobotics.org/resources/2015/rulebook.pdf">Click Here!</a></p>
</div>
<div class="col-sm-4">
<div class="list-group">
<a class="list-group-item active h4">Quick Links</a>
<a href="/robotics/2015/robot/" class="list-group-item">The Robot - A.L.I.C.E</a>
<a href="/robotics/2015/code/" class="list-group-item">The Code</a>
<a href="https://flic.kr/s/aHska26DoH" class="list-group-item">Gallery</a>
<a href="http://collyersstudentrobotics.blogspot.co.uk/" class="list-group-item">Blog</a>
<a href="https://www.studentrobotics.org/schools/game#2015" class="list-group-item">Competition Information</a>
</div>
</div>
</div>
</div>
<div class="image-panel" data-image="https://c2.staticflickr.com/8/7674/17308375182_a172a341d6_h.jpg"></div>
{% endblock %}

View file

@ -1,47 +0,0 @@
{% extends 'content_base.html' %}
{% block pageTitle %}The Robot - A.L.I.C.E{% endblock %}
{% block content%}
<div class="container">
<p>
Our entry for 2015, named 'ALICE', was a massive improvement over last years model, in both design, and the code for it. Before ALICE was built, the design team built us a very basic chassis usind scrap parts from 2014, which allowed us to write a large amount of the code base before we even had the robot built. Originally I wanted the final chassis to be built before the end of January, so we had a lot of time to test out the design for the robot and test using the final, in reality, it was closer to the middle of march before this was a reality.
</p>
</div>
<div class="container">
<div class="row">
<div class="col-sm-4">
<!-- Image of initial design (on paper) -->
</div>
<div class="col-sm-8">
</div>
</div>
<p>
The entire chassis was made from sheets of plywood, which we laser cut in college, allowing us to be very precise in the design of the robot to make sure that all the pieces would fit together properly, making the chassis less likely to break.
</p>
<p>
The initial design was concieved by Ben, at kickstart, and was then refined over the coming weeks by me and the rest of the building team. This was made much easier from the use of the 3d model, that ben made, which helped us visualize any changes that were to be made, as well as work out strategy by seeing the measurements we had to work with.
</p>
<p>
Once the build was completed, it was to a much higher design and quality than I could have ever imagined! It allowed us to forget about any shortcomings when it came to chassis, not having to compensate for weight distribution, or worry about the grip on the wheels.
</p>
</div>
<div class="image-panel" data-image="https://farm1.staticflickr.com/737/20984044320_ccbba155f9_o.gif"></div>
<div class="container">
<h2>Why call it 'ALICE'?</h2>
<p>The decision to name the robot 'Alice' was a decision made by the whole group!</p>
<p>Thats a lie, Ben suggested it and as no one had any better ideas and because he gets overruling vote on this, for some reason , it stuck.</p>
<p>After this decisions was made, I decided to set out to find the cheesiest acronym we could for 'Alice', to make the name slightly more interesting, and not some random girls name pulled from thin air on the bus ride home from kickstart. There were a few rather good ideas, most of them coming from Sam:</p>
<p><ul>
<li>'Automated Laser-cut Interactive Capturing Entity'</li>
<li>'Abnormally Lame and Innacurate Control-less Engine'</li>
<li>'Anti-Losing Immaculate Competitive Extravaganza'</li>
</ul></p>
<p>One idea was also suggested that we name the robot after the first sponsor we got, but as we didnt get one until after the team split, the other team took that name instead. In the end we decided to go with one that Sam initially suggested, so 'ALICE' officially stands for:</p>
<p><h3 class="center-text">'Autonomous Logistics and Inevitable Collision Engine'</h3></p>
</div>
<div class="image-panel" data-image="https://c2.staticflickr.com/8/7656/16687742984_ee1c76d1d9_h.jpg"></div>
{% endblock %}

View file

@ -1,64 +0,0 @@
{% extends 'content_base.html' %}
{% load static %}
{% block pageTitle %}Student Robotics{% endblock %}
{% block header_image %}<div class="image" style="background-image: url(https://farm9.staticflickr.com/8779/16687725664_13993f35d1_o_d.jpg);"></div>{% endblock %}
{% block content %}
<div class="container">
<p>Student Robotics is the the place where my development knowledge really started to grow. Thanks to the other people in my team teaching me. I had never done anything robotics related, and so when my computing teacher initially told us about it, I wasnt really interested. After I found out that my friend was also doing it, I signed up, and went along to the kickstart. From then on I was hooked, getting involved with all aspects of the development and design, as well as helping out other teams on the IRC room.</p>
</div>
<div class="container">
<h2>What is Student Robotics?</h2>
<blockquote cite="https://www.studentrobotics.org/about/">Student Robotics is a volunteer organisation that runs an annual robotics competition for 16-18 year olds. It was originally founded by students from the University of Southampton in 2006, and now includes volunteers (“Blue Shirts”) from multiple other universities, including the University of Bristol and Grenoble INP. It primarily takes teams and volunteers from the UK, but also some from Germany and France.</blockquote>
<p>More information can be found on <a href="https://studentrobotics.org">their website</a>.</p>
</div>
<div class="container">
<h2>My Entries</h2>
<p>Being at college for 2 years, meant I was able to enter 2 years of competitions, SR14, and SR15. We were encouraged to gain an online presence for our team, so I created a website for both years. Unfortunately due to account inactivity, and me changing my website 3 times since, The original pages have been lost, however all the content still remains.</p>
</div>
<div class="container">
<div class="row">
<div class="col-sm-6">
<div class="thumbnail">
<img src="https://c2.staticflickr.com/8/7670/17115168179_1ef30ac6e9_b.jpg" alt="Lucy">
<div class="caption">
<h3>Student Robotics 2014</h3>
<p><strong>Robot Name:</strong> Lucy
<br /><small>(No, it doesn't stand for anything)</small>
<p><a href="/robotics/2014/" class="btn btn-srobo btn-block">More Info</a></p>
</div>
</div>
</div>
<div class="col-sm-6">
<div class="thumbnail">
<img src="https://c2.staticflickr.com/8/7726/17309695331_584e7de16c_b.jpg" alt="A.L.I.C.E">
<div class="caption">
<h3>Student Robotics 2015</h3>
<p><strong>Robot Name : </strong> A.L.I.C.E
<br /><small>(<strong>A</strong>utonomous <strong>L</strong>ogistics and <strong>I</strong>nevitable <strong>C</strong>ollision <strong>E</strong>ngine)</small></p>
<p><a href="/robotics/2015/" class="btn btn-srobo btn-block" >More Info</a></p>
</div>
</div>
</div>
</div>
</div>
<div class="image-panel" data-image="{% static 'img/SR-logo-banner.png' %}"></div>
<div class="container">
<h2>Adult volunteer</h2>
<p>
Unfortunately, after I left college, I also left behind entering Student Robotics as a competitor. Fortunately for me however, they're always looking for volunteers to help run the competition itself.
</p>
<h4>
Years
</h4>
<ul>
<li>2016</li>
</ul>
</div>
{% endblock %}