add site content
73
build.py
Normal file
@ -0,0 +1,73 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import glob
|
||||
import markdown
|
||||
import os
|
||||
import re
|
||||
import shutil
|
||||
|
||||
input_directory = 'content'
|
||||
static_directory = 'static'
|
||||
output_directory = 'output'
|
||||
|
||||
md_extensions = ['fenced_code', 'codehilite', 'nl2br', 'toc', 'smarty', 'tables', 'linkify']
|
||||
|
||||
|
||||
def print_file(in_file, out_file):
|
||||
print('%-53s -> %s' % (in_file, out_file))
|
||||
|
||||
template = open('template.html').read()
|
||||
|
||||
os.makedirs(output_directory, exist_ok=True)
|
||||
|
||||
for (dirpath, _, filenames) in os.walk(static_directory):
|
||||
for filename in filenames:
|
||||
source = os.path.join(dirpath, filename)
|
||||
out_path = dirpath.replace(static_directory, '', 1)
|
||||
out_path = out_path.lstrip('/')
|
||||
dest_dir = os.path.join(output_directory, out_path)
|
||||
os.makedirs(dest_dir, exist_ok=True)
|
||||
dest = os.path.join(dest_dir, filename)
|
||||
print_file(source, dest)
|
||||
shutil.copy2(source, dest)
|
||||
|
||||
|
||||
out_filenames = []
|
||||
|
||||
# TODO: also walk the markdown directory
|
||||
for markdown_filename in glob.glob(os.path.join(input_directory, '*.md')):
|
||||
markdown_file = open(markdown_filename)
|
||||
text = markdown_file.read()
|
||||
markdown_file.close()
|
||||
|
||||
if not text.startswith('# '):
|
||||
text = '# ' + text
|
||||
|
||||
match = re.match(r'^(.*?)\n', text)
|
||||
if match:
|
||||
title = match.group(1).lstrip('#')
|
||||
else:
|
||||
title = text
|
||||
title += ' | Colin McMillen'
|
||||
if markdown_filename == os.path.join(input_directory, 'index.md'):
|
||||
title = 'Colin McMillen'
|
||||
|
||||
html = markdown.markdown(text, extensions=md_extensions, output_format='html5')
|
||||
output = template.replace('__TITLE_GOES_HERE__', title)
|
||||
output = output.replace('__CONTENT_GOES_HERE__', html)
|
||||
|
||||
out_filename = os.path.basename(markdown_filename).replace('.md', '.html')
|
||||
out_filenames.append(out_filename)
|
||||
out_fullpath = os.path.join(output_directory, out_filename)
|
||||
print_file(markdown_filename, out_fullpath)
|
||||
out_file = open(out_fullpath, 'w')
|
||||
out_file.write(output)
|
||||
out_file.close()
|
||||
|
||||
# TODO: make a sitemap / RSS?
|
||||
#index_filename = os.path.join(output_directory, 'index.html')
|
||||
#print_file('', index_filename)
|
||||
#index = open(index_filename, 'w')
|
||||
#for f in out_filenames:
|
||||
# index.write('<a href="%s">%s</a><br>' % (f, f))
|
||||
#index.close()
|
34
content/index.md
Normal file
@ -0,0 +1,34 @@
|
||||
# Welcome!
|
||||
|
||||
I'm the lead developer at [SemiColin Games](https://www.semicolin.games).
|
||||
Previously at Google, reCAPTCHA, & Carnegie Mellon.
|
||||
|
||||
| | |
|
||||
|-|-|
|
||||
| [![Twitter](/img/twitter.svg)](https://twitter.com/mcmillen) [@mcmillen](https://twitter.com/mcmillen) | [![Git](/img/git.svg)](https://git.mcmillen.dev/mcmillen?tab=activity) [git.mcmillen.dev](https://git.mcmillen.dev/mcmillen?tab=activity) |
|
||||
|
||||
For more details, check my [resumé](resume.html) & [publications](publications.html).
|
||||
|
||||
## Videogames
|
||||
|
||||
Currently playing: **Persona 5**, **Monster Hunter Rise**, & **Slipways**.
|
||||
Sometimes I stream on Twitch!
|
||||
|
||||
| | |
|
||||
|-|-|
|
||||
| [![Twitch](/img/twitch.svg)](https://twitch.tv/FamiColin) [FamiColin](https://twitch.tv/FamiColin) | [![Steam](/img/steam.svg)](https://steamcommunity.com/id/FamiColin/) [FamiColin](https://steamcommunity.com/id/FamiColin/) |
|
||||
| [![PlayStation](/img/playstation.svg)](https://psnprofiles.com/robomancer) [robomancer](https://psnprofiles.com/robomancer) | ![Nintendo Switch](/img/nintendoswitch.svg) SW-1906-3662-4308 |
|
||||
|
||||
## Recent Posts
|
||||
|
||||
* dolor woomy elispioscpcsposp veemo
|
||||
* another one
|
||||
* post #3
|
||||
|
||||
## Other Stuff
|
||||
|
||||
sigbovik etc
|
||||
|
||||
|
||||
|
||||
|
84
content/publications.md
Normal file
@ -0,0 +1,84 @@
|
||||
# Publications
|
||||
|
||||
## Ph.D. Thesis
|
||||
|
||||
[Thresholded-Rewards Decision Problems: Acting Effectively in Timed Domains.](papers/mcmillen-thesis.pdf)
|
||||
Colin McMillen.
|
||||
Technical report CMU-CS-09-112, Carnegie Mellon University, April 2, 2009.
|
||||
|
||||
## Journal Articles
|
||||
|
||||
[reCAPTCHA: Human-Based Character Recognition via Web Security Measures.](http://www.sciencemag.org/cgi/content/abstract/321/5895/1465)
|
||||
Luis von Ahn, Benjamin Maurer, Colin McMillen, David Abraham, and Manuel Blum.
|
||||
Science, 12 September 2008: 1465-1468.
|
||||
|
||||
[A Team of Humanoid Game Commentators.](https://www.cs.cmu.edu/~mmv/papers/08ijhr-cmcast.pdf)
|
||||
Manuela Veloso, Nicholas Armstrong-Crews, Sonia Chernova, Elisabeth Crawford, Colin McMillen, Maayan Roth, and Douglas Vail.
|
||||
International Journal of Humanoid Robotics, 2008.
|
||||
|
||||
[Resource Scheduling and Load Balancing in Distributed Robotic Control Systems.](papers/McMillen-2003-RAS-final.pdf)
|
||||
Colin McMillen, Kristen Stubbs, Paul E. Rybski, Sascha A. Stoeter, Maria Gini, and Nikolaos Papanikolopoulos.
|
||||
Robotics and Autonomous Systems, 2003.
|
||||
|
||||
[A Robot Team for Surveillance Tasks: Design and Architecture.](papers/Stoeter-2002-RAS-final.pdf)
|
||||
Sascha A. Stoeter, Paul E. Rybski, Kristen N. Stubbs, Colin McMillen, Maria Gini, Dean F. Hougen, and Nikolaos Papanikolopoulos.
|
||||
Robotics and Autonomous Systems, August 2002.
|
||||
|
||||
## Refereed Conference Papers
|
||||
|
||||
[Analysis of Multi-Robot Play Effectiveness and of Distributed Incidental Play Recognition.](http://www.cs.cmu.edu/~mmv/papers/08dars-colin.pdf)
|
||||
Colin McMillen and Manuela Veloso.
|
||||
Proceedings of Distributed Autonomous Robotic Systems (DARS 2008), November 2008.
|
||||
|
||||
[Unknown Rewards in Finite-Horizon Domains.](papers/McMillen-2008-AAAI-final.pdf)
|
||||
Colin McMillen and Manuela Veloso.
|
||||
Proceedings of the Twenty-Second Conference on Artificial Intelligence (AAAI-08), July 2008.
|
||||
|
||||
[Thresholded Rewards: Acting Optimally in Timed, Zero-Sum Games.](papers/McMillen-2007-AAAI-final.pdf)
|
||||
Colin McMillen and Manuela Veloso.
|
||||
Proceedings of the Twenty-Second Conference on Artificial Intelligence (AAAI-07), July 2007.
|
||||
*AAAI-07 Outstanding Paper Award*
|
||||
|
||||
[A Team of Humanoid Game Commentators.](papers/Veloso-2006-Humanoids.pdf)
|
||||
Manuela Veloso, Nicholas Armstrong-Crews, Sonia Chernova, Elisabeth Crawford, Colin McMillen, Maayan Roth, and Douglas Vail.
|
||||
Proceedings of the IEEE-RAS International Conference on Humanoid Robots (Humanoids'06), Genova, Italy, December 2006.
|
||||
|
||||
[Distributed, Play-Based Role Assignment for Robot Teams in Dynamic Environments.](papers/McMillen-2006-DARS-final.pdf)
|
||||
Colin McMillen and Manuela Veloso.
|
||||
Proceedings of DARS 2006, Minneapolis, MN, July 2006.
|
||||
|
||||
[Distributed, Play-Based Coordination for Robot Teams in Dynamic Environments.](papers/McMillen-2006-RoboCup-final.pdf)
|
||||
Colin McMillen and Manuela Veloso.
|
||||
Proceedings of the RoboCup International Symposium, Bremen, Germany, June 2006.
|
||||
|
||||
[Levels of Multi-Robot Coordination for Dynamic Environments.](papers/McMillen-2005-NRL-final.pdf)
|
||||
Colin McMillen, Paul Rybski, and Manuela Veloso.
|
||||
Multi-Robot Systems: From Swarms to Intelligent Automata, Volume III, 2005.
|
||||
|
||||
[MinneTAC Sales Strategies for Supply Chain TAC.](papers/Ketter-2004-AAMAS.pdf)
|
||||
Wolfgang Ketter, Elena Kryzhnyaya, Steven Damer, Colin McMillen, Amrudin Agovic, John Collins, and Maria Gini.
|
||||
Proceedings of the Third International Conference on Autonomous Agents and Multi-Agent Systems, New York, July 2004.
|
||||
|
||||
[Analysis and Design of Supply-Driven Strategies in TAC SCM.](papers/Ketter-2004-AAMAS-workshop.pdf)
|
||||
Wolfgang Ketter, Elena Kryzhnyaya, Steven Damer, Colin McMillen, Amrudin Agovic, John Collins, and Maria Gini.
|
||||
AAMAS04: Workshop on Trading Agent Design and Analysis, New York, July 2004.
|
||||
|
||||
[A Real-Time Collision Warning System for Intersections.](papers/Stubbs-2003-ITSA-final.pdf)
|
||||
Kristen Stubbs, Hemanth Arumugam, Osama Masoud, Colin McMillen, Harini Veeraraghavan, Ravi Janardan, and Nikos Papanikolopoulos.
|
||||
Proceedings of Intelligent Transportation Systems America, Minneapolis, MN, USA, May 2003.
|
||||
|
||||
[Heterogeneous Implementation of an Adaptive Robotic Sensing Team.](papers/Kratochvil-2003-ICRA-final.pdf)
|
||||
Bradley Kratochvil, Ian T. Burt, Andrew Drenner, Derek Goerke, Bennett Jackson, Colin McMillen, Christopher Olson, Nikolaos Papanikolopoulos, Adam Pfeifer, Sascha A. Stoeter, Kristen Stubbs, and David Waletzko.
|
||||
Proceedings of the IEEE International Conference on Robotics and Automation, Taipei, Taiwan, May 2003.
|
||||
|
||||
[Design of the UMN Multi-Robot System.](papers/Drenner-2002-NRL-final.pdf)
|
||||
Andrew Drenner, Ian Burt, Brian Chapeau, Tom Dahlin, Bradley Kratochvil, Colin McMillen, Brad Nelson, Nikolaos Papanikolopoulos, Paul E. Rybski, Kristen Stubbs, David Waletzko, and Kemal Berk Yesin.
|
||||
Multi-Robot Systems: From Swarms to Intelligent Automata, May 2002.
|
||||
|
||||
[Mobility Enhancements to the Scout Robot Platform.](papers/Drenner-2002-ICRA-final.pdf)
|
||||
Andrew Drenner, Ian Burt, Tom Dahlin, Bradley Kratochvil, Colin McMillen, Brad Nelson, Nikolaos Papanikolopoulos, Paul E. Rybski, Kristen Stubbs, David Waletzko, and Kemal Berk Yesin.
|
||||
Proceedings of the 2002 IEEE International Conference on Robotics and Automation, Washington D.C., USA, May 2002.
|
||||
|
||||
[Resource Scheduling and Load Balancing in Distributed Robotic Control Systems.](papers/McMillen-2002-IAS-final.pdf)
|
||||
Colin McMillen, Kristen Stubbs, Paul E. Rybski, Sascha A. Stoeter, Maria Gini, and Nikolaos Papanikolopoulos.
|
||||
Proceedings of the International Conference on Intelligent Autonomous Systems, Marina del Rey, CA, U.S.A., March 2002.
|
28
content/resume.md
Normal file
@ -0,0 +1,28 @@
|
||||
# Resumé
|
||||
|
||||
## SemiColin Games
|
||||
|
||||
Lead Developer
|
||||
February 2019 -- Present
|
||||
|
||||
## Google
|
||||
|
||||
Staff Software Engineer
|
||||
September 2009 -- February 2019
|
||||
|
||||
Projects: [Chrome Canvas](https://canvas.apps.chrome), [Android Wear Handwriting](https://www.androidauthority.com/google-handwriting-keyboard-android-wear-2-0-devices-764084/), [Digital Attack Map](https://digitalattackmap.com), [Google Dictionary](https://www.google.com/search?q=define+mortgage), [Google Translate](https://translate.google.com), [Google Books](https://books.google.com), & [reCAPTCHA](https://www.google.com/recaptcha).
|
||||
|
||||
## reCAPTCHA
|
||||
|
||||
Co-Founder & Software Engineer
|
||||
June 2007 -- September 2009
|
||||
|
||||
## Carnegie Mellon University
|
||||
|
||||
Ph.D. Computer Science
|
||||
September 2003 -- May 2009
|
||||
|
||||
## University of Minnesota
|
||||
|
||||
B.S. Computer Science
|
||||
September 1999 -- May 2003
|
141
content/test.md
Normal file
@ -0,0 +1,141 @@
|
||||
# Test Page
|
||||
|
||||
[TOC]
|
||||
|
||||
## Oolong Tea
|
||||
- Jade Nantou: rolled. gentle flavor, a bit sweet and floral. Great both hot and cold-brewed.
|
||||
- Fern Stream Amber Oolong: okay but I didn’t like it as much as the Jade Nantou. A bit earthier, less gentle.
|
||||
- Bei Dou: twisted. 3g in 200ml water, 2 min infusion: pretty strong, but good. Mineral-y? Smoky, maybe, in the sense of whiskey rather than lapsang souchong. 6g as iced tea is nicely strong. One of my favorites.
|
||||
- Golden Buds Milk Oolong Jin Xuan: 200F. Reminds me of the Jade Nantou, but more floral? Given that it’s more expensive than the Jade Nantou, seems less worth keeping around except for occasional variety.
|
||||
- Shan Lin Xi: rolled. 195F. another floral sort of tea. Beautiful full leaves.
|
||||
- Baked GABA: rolled. 200F. strong aroma of raisins. Ended up finding this a bit too cloying (?)
|
||||
- Wudong Lao Cong: twisted. 175F. Another earthy / mineral-y tea, maybe less so than the Bei Dou? It’s pretty pricey since it comes from 300-year-old trees.
|
||||
|
||||
## Green Tea
|
||||
- Sencha Asatsuyu: well-rounded. Some notes of corn? Or popcorn? Strong without being fishy.
|
||||
- Sencha Yame: pretty bold. I like it iced, and hot when I’m feeling like something grassier.
|
||||
- Sencha Fukumushi: also pretty strongly-flavored / vegetal.
|
||||
- Sencha Fuji / Asanoka: also in the “well-rounded” bin for me.
|
||||
- Gyokuro: good, but 160F brew = less hot for winter. Try again in summer?
|
||||
- Bi Luo Chun: 3g, 3 min infusion: pretty gentle taste (even with a long steep) but hints of cayenne. Ultimately, not too impressive to me.
|
||||
- Dragonwell Long Jing: pretty good, closer to a Japanese green tea taste than the Bi Luo Chun. When iced, reminds me a lot of store-bought iced green tea -- very default sort of flavor.
|
||||
- Yamacha Hamamatsu (from Dobra in Pittsburgh): very good, Japanese green tea that’s halfway to Chinese in terms of larger leaves, well-rounded green tea taste.
|
||||
- Golden Green: I liked this more than expected? Kinda floral a little bit?
|
||||
|
||||
## Black Tea
|
||||
- Irish Breakfast Tea, Assam Chandighat Estate: solidly astringent & strong.
|
||||
- Yunnan Gold Tips: a little more interesting than a breakfast tea but not like, a lot? idk
|
||||
|
||||
## Rosemary Gimlet
|
||||
via https://www.davidlebovitz.com/rosemary-gimlet-gin-cocktail-recipe/
|
||||
|
||||
2oz gin, 3/4 oz lime juice, 3/4 oz rosemary simple syrup. Shake with ice.
|
||||
Good with both gin (Tanqueray) and white rum (Bully Boy)
|
||||
|
||||
## Rosemary Simple Syrup
|
||||
|
||||
Heat until mixture is hot and sugar dissolves. (I let it gently simmer for about 10 minutes.)
|
||||
Let cool to room temperature, then strain and refrigerate.
|
||||
|
||||
Thyme simple syrup: as above, but about 2g thyme (10-12 sprigs of a few inches)? Was a bit weak, let’s try 4g next time.
|
||||
|
||||
## Spearmint Simple Syrup
|
||||
160g water, 160g sugar, 10g spearmint
|
||||
|
||||
## Milk-Washed Rum (or Seedlip)
|
||||
Start with 6 oz rum, pour in 2 oz whole milk. Add lime-strength orange juice until milk starts to curdle. Stir it gently. Let set for some hours, then strain through coffee filters.
|
||||
|
||||
## Dr. J (Orange Julius cocktail)
|
||||
2 oz milk-washed rum, 3/4 oz lime-strength orange juice, 3/4 oz simple syrup (or 3/4 tbsp sugar + 3/4 tbsp water). Shake with ice.
|
||||
|
||||
## Pesto
|
||||
2 cups fresh basil leaves (no stems, about 50g)
|
||||
2 tablespoons pine nuts or toasted almonds
|
||||
2 large cloves garlic (I’ve used double this for more garlic flavor... = 2 tsp minced)
|
||||
1/2 cup extra-virgin olive oil
|
||||
|
||||
Combine basil leaves, nuts, and garlic in a food processor and process until very finely minced. With the machine running slowly dribble in the oil and process until the mixture is smooth. Store in refrigerator or freezer.
|
||||
|
||||
## Coffee Liqueur
|
||||
Following this recipe:
|
||||
https://www.seriouseats.com/recipes/2012/01/diy-coffee-liqueur-homemade-kahlua.html
|
||||
With Peet’s Decaf Dark Roast House Blend (pre-ground from Bfresh).
|
||||
|
||||
## Basilgeuse
|
||||
1.5oz gin, 1oz dry vermouth, 1/2-3/4oz simple syrup, 2 dashes ginger bitters, about 8 basil leaves muddled and another top for garnish
|
||||
|
||||
# Hugo Installation
|
||||
|
||||
I got Hugo v0.83.1 from https://github.com/gohugoio/hugo/releases
|
||||
|
||||
```shell
|
||||
wget https://github.com/gohugoio/hugo/releases/download/v0.83.1/hugo_0.83.1_Linux-64bit.deb
|
||||
sudo dpkg -i hugo_0.83.1_Linux-64bit.deb
|
||||
```
|
||||
|
||||
`hugo version` tells me:
|
||||
`hugo v0.83.1-5AFE0A57 linux/amd64 BuildDate=2021-05-02T14:38:05Z VendorInfo=gohugoio`
|
||||
|
||||
Following the install instructions from
|
||||
https://gohugo.io/getting-started/quick-start/
|
||||
|
||||
and using the PaperMod theme:
|
||||
https://adityatelange.github.io/hugo-PaperMod/posts/papermod/papermod-installation/
|
||||
|
||||
```shell
|
||||
# Make new site with YAML config files
|
||||
hugo new site hugotest -f yml
|
||||
cd hugotest
|
||||
git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod --depth=1
|
||||
vim config.yml
|
||||
# add this on a new line:
|
||||
# theme: "PaperMod"
|
||||
```
|
||||
|
||||
To update the theme later:
|
||||
```shell
|
||||
cd themes/PaperMod
|
||||
git pull
|
||||
```
|
||||
|
||||
## Make a new post
|
||||
|
||||
```shell
|
||||
hugo new posts/hello-world.md
|
||||
/home/mcmillen/hugotest/content/posts/hello-world.md created
|
||||
```
|
||||
|
||||
## Running the server so that I can access it from my phone on Tailscale:
|
||||
|
||||
`hugo server --baseURL http://100.81.145.47 --bind 100.81.145.47 -D`
|
||||
|
||||
## now some code
|
||||
|
||||
```shell
|
||||
# Make new site with YAML config files
|
||||
hugo new site hugotest -f yml
|
||||
cd hugotest
|
||||
git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod --depth=1
|
||||
vim config.yml
|
||||
# add this on a new line:
|
||||
# theme: "PaperMod"
|
||||
```
|
||||
|
||||
## python
|
||||
|
||||
```python
|
||||
import markdown
|
||||
markdown.markdown('hello world')
|
||||
print('what is this?')
|
||||
x = 42
|
||||
open('foo.html', 'w').write('oh no')
|
||||
'012345678901234567890123456789012345678901234567890123456789012345678901234567'
|
||||
```
|
||||
|
||||
## python markdown references
|
||||
|
||||
https://python-markdown.github.io/extensions/
|
||||
|
||||
https://python-markdown.github.io/extensions/code_hilite/
|
||||
|
||||
`pygmentize -S monokai -f html -a .codehilite > pygments.css`
|
45
linkify.py
Normal file
@ -0,0 +1,45 @@
|
||||
# Forked from https://github.com/daGrevis/mdx_linkify/blob/master/mdx_linkify/mdx_linkify.py
|
||||
# Added linker_options.setdefault("callbacks", []) so that rel=nofollow isn't automatically added.
|
||||
|
||||
from bleach.linkifier import Linker
|
||||
|
||||
from markdown.postprocessors import Postprocessor
|
||||
from markdown.extensions import Extension
|
||||
|
||||
|
||||
class LinkifyExtension(Extension):
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
self.config = {
|
||||
'linker_options': [{}, 'Options for bleach.linkifier.Linker'],
|
||||
}
|
||||
super(LinkifyExtension, self).__init__(**kwargs)
|
||||
|
||||
def extendMarkdown(self, md):
|
||||
md.postprocessors.register(
|
||||
LinkifyPostprocessor(
|
||||
md,
|
||||
self.getConfig('linker_options'),
|
||||
),
|
||||
"linkify",
|
||||
50,
|
||||
)
|
||||
|
||||
|
||||
class LinkifyPostprocessor(Postprocessor):
|
||||
|
||||
def __init__(self, md, linker_options):
|
||||
super(LinkifyPostprocessor, self).__init__(md)
|
||||
linker_options.setdefault("skip_tags", ["code"])
|
||||
linker_options.setdefault("callbacks", [])
|
||||
self._linker_options = linker_options
|
||||
|
||||
def run(self, text):
|
||||
linker = Linker(**self._linker_options)
|
||||
return linker.linkify(text)
|
||||
|
||||
|
||||
def makeExtension(*args, **kwargs):
|
||||
return LinkifyExtension(*args, **kwargs)
|
||||
|
||||
makeExtension()
|
BIN
static/favicon-32.png
Normal file
After Width: | Height: | Size: 3.1 KiB |
BIN
static/favicon-512.png
Normal file
After Width: | Height: | Size: 210 KiB |
BIN
static/favicon.png
Normal file
After Width: | Height: | Size: 648 KiB |
1
static/googledb51837fb3ea4073.html
Normal file
@ -0,0 +1 @@
|
||||
google-site-verification: googledb51837fb3ea4073.html
|
1
static/googlehostedservice.html
Normal file
@ -0,0 +1 @@
|
||||
google94bca5e76bc84f5
|
1
static/img/git.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M23.546 10.93L13.067.452c-.604-.603-1.582-.603-2.188 0L8.708 2.627l2.76 2.76c.645-.215 1.379-.07 1.889.441.516.515.658 1.258.438 1.9l2.658 2.66c.645-.223 1.387-.078 1.9.435.721.72.721 1.884 0 2.604-.719.719-1.881.719-2.6 0-.539-.541-.674-1.337-.404-1.996L12.86 8.955v6.525c.176.086.342.203.488.348.713.721.713 1.883 0 2.6-.719.721-1.889.721-2.609 0-.719-.719-.719-1.879 0-2.598.182-.18.387-.316.605-.406V8.835c-.217-.091-.424-.222-.6-.401-.545-.545-.676-1.342-.396-2.009L7.636 3.7.45 10.881c-.6.605-.6 1.584 0 2.189l10.48 10.477c.604.604 1.582.604 2.186 0l10.43-10.43c.605-.603.605-1.582 0-2.187 "></path></svg>
|
After Width: | Height: | Size: 963 B |
1
static/img/nintendoswitch.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M14.176 24h3.674c3.376 0 6.15-2.774 6.15-6.15V6.15C24 2.775 21.226 0 17.85 0H14.1c-.074 0-.15.074-.15.15v23.7c-.001.076.075.15.226.15zm4.574-13.199c1.351 0 2.399 1.125 2.399 2.398 0 1.352-1.125 2.4-2.399 2.4-1.35 0-2.4-1.049-2.4-2.4-.075-1.349 1.05-2.398 2.4-2.398zM11.4 0H6.15C2.775 0 0 2.775 0 6.15v11.7C0 21.226 2.775 24 6.15 24h5.25c.074 0 .15-.074.15-.149V.15c.001-.076-.075-.15-.15-.15zM9.676 22.051H6.15c-2.326 0-4.201-1.875-4.201-4.201V6.15c0-2.326 1.875-4.201 4.201-4.201H9.6l.076 20.102zM3.75 7.199c0 1.275.975 2.25 2.25 2.25s2.25-.975 2.25-2.25c0-1.273-.975-2.25-2.25-2.25s-2.25.977-2.25 2.25z "></path></svg>
|
After Width: | Height: | Size: 972 B |
1
static/img/playstation.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M8.985 2.596v17.548l3.915 1.261V6.688c0-.69.304-1.151.794-.991.636.181.76.814.76 1.505v5.876c2.441 1.193 4.362-.002 4.362-3.153 0-3.237-1.126-4.675-4.438-5.827-1.307-.448-3.728-1.186-5.391-1.502h-.002zm4.656 16.242l6.296-2.275c.715-.258.826-.625.246-.818-.586-.192-1.637-.139-2.357.123l-4.205 1.499v-2.385l.24-.085s1.201-.42 2.913-.615c1.696-.18 3.785.029 5.437.661 1.848.601 2.041 1.472 1.576 2.072s-1.622 1.036-1.622 1.036l-8.544 3.107v-2.297l.02-.023zM1.808 18.6c-1.9-.545-2.214-1.668-1.352-2.321.801-.585 2.159-1.051 2.159-1.051l5.616-2.013v2.313L4.206 17c-.705.271-.825.632-.239.826.586.195 1.637.15 2.343-.12L8.248 17v2.074c-.121.029-.256.044-.391.073-1.938.331-3.995.196-6.037-.479l-.012-.068z "></path></svg>
|
After Width: | Height: | Size: 1.0 KiB |
1
static/img/steam.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M11.979 0C5.678 0 .511 4.86.022 11.037l6.432 2.658c.545-.371 1.203-.59 1.912-.59.063 0 .125.004.188.006l2.861-4.142V8.91c0-2.495 2.028-4.524 4.524-4.524 2.494 0 4.524 2.031 4.524 4.527s-2.03 4.525-4.524 4.525h-.105l-4.076 2.911c0 .052.004.105.004.159 0 1.875-1.515 3.396-3.39 3.396-1.635 0-3.016-1.173-3.331-2.727L.436 15.27C1.862 20.307 6.486 24 11.979 24c6.627 0 11.999-5.373 11.999-12S18.605 0 11.979 0zM7.54 18.21l-1.473-.61c.262.543.714.999 1.314 1.25 1.297.539 2.793-.076 3.332-1.375.263-.63.264-1.319.005-1.949s-.75-1.121-1.377-1.383c-.624-.26-1.29-.249-1.878-.03l1.523.63c.956.4 1.409 1.5 1.009 2.455-.397.957-1.497 1.41-2.454 1.012H7.54zm11.415-9.303c0-1.662-1.353-3.015-3.015-3.015-1.665 0-3.015 1.353-3.015 3.015 0 1.665 1.35 3.015 3.015 3.015 1.663 0 3.015-1.35 3.015-3.015zm-5.273-.005c0-1.252 1.013-2.266 2.265-2.266 1.249 0 2.266 1.014 2.266 2.266 0 1.251-1.017 2.265-2.266 2.265-1.253 0-2.265-1.014-2.265-2.265z "></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
static/img/twitch.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M2.089 0L.525 4.175v16.694h5.736V24h3.132l3.127-3.132h4.695l6.26-6.258V0H2.089zm2.086 2.085H21.39v11.479l-3.652 3.652H12l-3.127 3.127v-3.127H4.175V2.085zM9.915 12.522H12v-6.26H9.915v6.26zm5.735 0h2.086v-6.26H15.65v6.26z "></path></svg>
|
After Width: | Height: | Size: 587 B |
1
static/img/twitter.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" fill="#ffffff" fill-rule="evenodd" clip-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.414"><path fill-rule="nonzero" d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z "></path></svg>
|
After Width: | Height: | Size: 1010 B |
131
static/language_checklist.html
Normal file
@ -0,0 +1,131 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>
|
||||
Programming Language Checklist
|
||||
</title>
|
||||
<link rel="shortcut icon" type="image/png" href="/favicon.png"/>
|
||||
<script type="text/javascript">
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-25704949-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<tt>
|
||||
Programming Language Checklist<br>
|
||||
by <a href="https://famicol.in">Colin McMillen</a>, <a href="http://jcreed.org">Jason Reed</a>, and <a href="https://elly.town/">Elly Fong-Jones</a>, 2011-10-10.
|
||||
<br>
|
||||
<p>
|
||||
<pre>
|
||||
You appear to be advocating a new:
|
||||
[ ] functional [ ] imperative [ ] object-oriented [ ] procedural [ ] stack-based
|
||||
[ ] "multi-paradigm" [ ] lazy [ ] eager [ ] statically-typed [ ] dynamically-typed
|
||||
[ ] pure [ ] impure [ ] non-hygienic [ ] visual [ ] beginner-friendly
|
||||
[ ] non-programmer-friendly [ ] completely incomprehensible
|
||||
programming language. Your language will not work. Here is why it will not work.
|
||||
|
||||
You appear to believe that:
|
||||
[ ] Syntax is what makes programming difficult
|
||||
[ ] Garbage collection is free [ ] Computers have infinite memory
|
||||
[ ] Nobody really needs:
|
||||
[ ] concurrency [ ] a REPL [ ] debugger support [ ] IDE support [ ] I/O
|
||||
[ ] to interact with code not written in your language
|
||||
[ ] The entire world speaks 7-bit ASCII
|
||||
[ ] Scaling up to large software projects will be easy
|
||||
[ ] Convincing programmers to adopt a new language will be easy
|
||||
[ ] Convincing programmers to adopt a language-specific IDE will be easy
|
||||
[ ] Programmers love writing lots of boilerplate
|
||||
[ ] Specifying behaviors as "undefined" means that programmers won't rely on them
|
||||
[ ] "Spooky action at a distance" makes programming more fun
|
||||
|
||||
Unfortunately, your language (has/lacks):
|
||||
[ ] comprehensible syntax [ ] semicolons [ ] significant whitespace [ ] macros
|
||||
[ ] implicit type conversion [ ] explicit casting [ ] type inference
|
||||
[ ] goto [ ] exceptions [ ] closures [ ] tail recursion [ ] coroutines
|
||||
[ ] reflection [ ] subtyping [ ] multiple inheritance [ ] operator overloading
|
||||
[ ] algebraic datatypes [ ] recursive types [ ] polymorphic types
|
||||
[ ] covariant array typing [ ] monads [ ] dependent types
|
||||
[ ] infix operators [ ] nested comments [ ] multi-line strings [ ] regexes
|
||||
[ ] call-by-value [ ] call-by-name [ ] call-by-reference [ ] call-cc
|
||||
|
||||
The following philosophical objections apply:
|
||||
[ ] Programmers should not need to understand category theory to write "Hello, World!"
|
||||
[ ] Programmers should not develop RSI from writing "Hello, World!"
|
||||
[ ] The most significant program written in your language is its own compiler
|
||||
[ ] The most significant program written in your language isn't even its own compiler
|
||||
[ ] No language spec
|
||||
[ ] "The implementation is the spec"
|
||||
[ ] The implementation is closed-source [ ] covered by patents [ ] not owned by you
|
||||
[ ] Your type system is unsound [ ] Your language cannot be unambiguously parsed
|
||||
[ ] a proof of same is attached
|
||||
[ ] invoking this proof crashes the compiler
|
||||
[ ] The name of your language makes it impossible to find on Google
|
||||
[ ] Interpreted languages will never be as fast as C
|
||||
[ ] Compiled languages will never be "extensible"
|
||||
[ ] Writing a compiler that understands English is AI-complete
|
||||
[ ] Your language relies on an optimization which has never been shown possible
|
||||
[ ] There are less than 100 programmers on Earth smart enough to use your language
|
||||
[ ] ____________________________ takes exponential time
|
||||
[ ] ____________________________ is known to be undecidable
|
||||
|
||||
Your implementation has the following flaws:
|
||||
[ ] CPUs do not work that way
|
||||
[ ] RAM does not work that way
|
||||
[ ] VMs do not work that way
|
||||
[ ] Compilers do not work that way
|
||||
[ ] Compilers cannot work that way
|
||||
[ ] Shift-reduce conflicts in parsing seem to be resolved using rand()
|
||||
[ ] You require the compiler to be present at runtime
|
||||
[ ] You require the language runtime to be present at compile-time
|
||||
[ ] Your compiler errors are completely inscrutable
|
||||
[ ] Dangerous behavior is only a warning
|
||||
[ ] The compiler crashes if you look at it funny
|
||||
[ ] The VM crashes if you look at it funny
|
||||
[ ] You don't seem to understand basic optimization techniques
|
||||
[ ] You don't seem to understand basic systems programming
|
||||
[ ] You don't seem to understand pointers
|
||||
[ ] You don't seem to understand functions
|
||||
|
||||
Additionally, your marketing has the following problems:
|
||||
[ ] Unsupported claims of increased productivity
|
||||
[ ] Unsupported claims of greater "ease of use"
|
||||
[ ] Obviously rigged benchmarks
|
||||
[ ] Graphics, simulation, or crypto benchmarks where your code just calls
|
||||
handwritten assembly through your FFI
|
||||
[ ] String-processing benchmarks where you just call PCRE
|
||||
[ ] Matrix-math benchmarks where you just call BLAS
|
||||
[ ] Noone really believes that your language is faster than:
|
||||
[ ] assembly [ ] C [ ] FORTRAN [ ] Java [ ] Ruby [ ] Prolog
|
||||
[ ] Rejection of orthodox programming-language theory without justification
|
||||
[ ] Rejection of orthodox systems programming without justification
|
||||
[ ] Rejection of orthodox algorithmic theory without justification
|
||||
[ ] Rejection of basic computer science without justification
|
||||
|
||||
Taking the wider ecosystem into account, I would like to note that:
|
||||
[ ] Your complex sample code would be one line in: _______________________
|
||||
[ ] We already have an unsafe imperative language
|
||||
[ ] We already have a safe imperative OO language
|
||||
[ ] We already have a safe statically-typed eager functional language
|
||||
[ ] You have reinvented Lisp but worse
|
||||
[ ] You have reinvented Javascript but worse
|
||||
[ ] You have reinvented Java but worse
|
||||
[ ] You have reinvented C++ but worse
|
||||
[ ] You have reinvented PHP but worse
|
||||
[ ] You have reinvented PHP better, but that's still no justification
|
||||
[ ] You have reinvented Brainfuck but non-ironically
|
||||
|
||||
In conclusion, this is what I think of you:
|
||||
[ ] You have some interesting ideas, but this won't fly.
|
||||
[ ] This is a bad language, and you should feel bad for inventing it.
|
||||
[ ] Programming in this language is an adequate punishment for inventing it.
|
||||
</pre>
|
||||
</tt>
|
||||
</body>
|
||||
</html>
|
BIN
static/papers/Drenner-2002-ICRA-final.pdf
Normal file
BIN
static/papers/Drenner-2002-NRL-final.pdf
Normal file
BIN
static/papers/Ketter-2004-AAMAS-final.pdf
Normal file
BIN
static/papers/Ketter-2004-AAMAS-workshop.pdf
Normal file
BIN
static/papers/Ketter-2004-AAMAS.pdf
Normal file
BIN
static/papers/Kratochvil-2003-ICRA-final.pdf
Normal file
BIN
static/papers/McMillen-2002-IAS-final.pdf
Normal file
BIN
static/papers/McMillen-2003-RAS-final.pdf
Normal file
BIN
static/papers/McMillen-2003-UndergradThesis-final.pdf
Normal file
BIN
static/papers/McMillen-2005-NRL-final.pdf
Normal file
BIN
static/papers/McMillen-2006-DARS-final.pdf
Normal file
BIN
static/papers/McMillen-2006-RoboCup-final.pdf
Normal file
BIN
static/papers/McMillen-2006-TheoryML-final.pdf
Normal file
BIN
static/papers/McMillen-2007-AAAI-final.pdf
Normal file
BIN
static/papers/McMillen-2007-proposal.pdf
Normal file
BIN
static/papers/McMillen-2008-AAAI-final.pdf
Normal file
BIN
static/papers/Stoeter-2002-RAS-final.pdf
Normal file
5145
static/papers/Stubbs-2003-ITSA-final.pdf
Normal file
BIN
static/papers/Veloso-2006-Humanoids.pdf
Normal file
BIN
static/papers/mcmillen-thesis.pdf
Normal file
70
static/pygments.css
Normal file
@ -0,0 +1,70 @@
|
||||
.codehilite .hll { background-color: #49483e }
|
||||
.codehilite { background: #272822; color: #f8f8f2 }
|
||||
.codehilite .c { color: #75715e } /* Comment */
|
||||
.codehilite .err { color: #960050; background-color: #1e0010 } /* Error */
|
||||
.codehilite .k { color: #66d9ef } /* Keyword */
|
||||
.codehilite .l { color: #ae81ff } /* Literal */
|
||||
.codehilite .n { color: #f8f8f2 } /* Name */
|
||||
.codehilite .o { color: #f92672 } /* Operator */
|
||||
.codehilite .p { color: #f8f8f2 } /* Punctuation */
|
||||
.codehilite .ch { color: #75715e } /* Comment.Hashbang */
|
||||
.codehilite .cm { color: #75715e } /* Comment.Multiline */
|
||||
.codehilite .cp { color: #75715e } /* Comment.Preproc */
|
||||
.codehilite .cpf { color: #75715e } /* Comment.PreprocFile */
|
||||
.codehilite .c1 { color: #75715e } /* Comment.Single */
|
||||
.codehilite .cs { color: #75715e } /* Comment.Special */
|
||||
.codehilite .gd { color: #f92672 } /* Generic.Deleted */
|
||||
.codehilite .ge { font-style: italic } /* Generic.Emph */
|
||||
.codehilite .gi { color: #a6e22e } /* Generic.Inserted */
|
||||
.codehilite .gs { font-weight: bold } /* Generic.Strong */
|
||||
.codehilite .gu { color: #75715e } /* Generic.Subheading */
|
||||
.codehilite .kc { color: #66d9ef } /* Keyword.Constant */
|
||||
.codehilite .kd { color: #66d9ef } /* Keyword.Declaration */
|
||||
.codehilite .kn { color: #f92672 } /* Keyword.Namespace */
|
||||
.codehilite .kp { color: #66d9ef } /* Keyword.Pseudo */
|
||||
.codehilite .kr { color: #66d9ef } /* Keyword.Reserved */
|
||||
.codehilite .kt { color: #66d9ef } /* Keyword.Type */
|
||||
.codehilite .ld { color: #e6db74 } /* Literal.Date */
|
||||
.codehilite .m { color: #ae81ff } /* Literal.Number */
|
||||
.codehilite .s { color: #e6db74 } /* Literal.String */
|
||||
.codehilite .na { color: #a6e22e } /* Name.Attribute */
|
||||
.codehilite .nb { color: #f8f8f2 } /* Name.Builtin */
|
||||
.codehilite .nc { color: #a6e22e } /* Name.Class */
|
||||
.codehilite .no { color: #66d9ef } /* Name.Constant */
|
||||
.codehilite .nd { color: #a6e22e } /* Name.Decorator */
|
||||
.codehilite .ni { color: #f8f8f2 } /* Name.Entity */
|
||||
.codehilite .ne { color: #a6e22e } /* Name.Exception */
|
||||
.codehilite .nf { color: #a6e22e } /* Name.Function */
|
||||
.codehilite .nl { color: #f8f8f2 } /* Name.Label */
|
||||
.codehilite .nn { color: #f8f8f2 } /* Name.Namespace */
|
||||
.codehilite .nx { color: #a6e22e } /* Name.Other */
|
||||
.codehilite .py { color: #f8f8f2 } /* Name.Property */
|
||||
.codehilite .nt { color: #f92672 } /* Name.Tag */
|
||||
.codehilite .nv { color: #f8f8f2 } /* Name.Variable */
|
||||
.codehilite .ow { color: #f92672 } /* Operator.Word */
|
||||
.codehilite .w { color: #f8f8f2 } /* Text.Whitespace */
|
||||
.codehilite .mb { color: #ae81ff } /* Literal.Number.Bin */
|
||||
.codehilite .mf { color: #ae81ff } /* Literal.Number.Float */
|
||||
.codehilite .mh { color: #ae81ff } /* Literal.Number.Hex */
|
||||
.codehilite .mi { color: #ae81ff } /* Literal.Number.Integer */
|
||||
.codehilite .mo { color: #ae81ff } /* Literal.Number.Oct */
|
||||
.codehilite .sa { color: #e6db74 } /* Literal.String.Affix */
|
||||
.codehilite .sb { color: #e6db74 } /* Literal.String.Backtick */
|
||||
.codehilite .sc { color: #e6db74 } /* Literal.String.Char */
|
||||
.codehilite .dl { color: #e6db74 } /* Literal.String.Delimiter */
|
||||
.codehilite .sd { color: #e6db74 } /* Literal.String.Doc */
|
||||
.codehilite .s2 { color: #e6db74 } /* Literal.String.Double */
|
||||
.codehilite .se { color: #ae81ff } /* Literal.String.Escape */
|
||||
.codehilite .sh { color: #e6db74 } /* Literal.String.Heredoc */
|
||||
.codehilite .si { color: #e6db74 } /* Literal.String.Interpol */
|
||||
.codehilite .sx { color: #e6db74 } /* Literal.String.Other */
|
||||
.codehilite .sr { color: #e6db74 } /* Literal.String.Regex */
|
||||
.codehilite .s1 { color: #e6db74 } /* Literal.String.Single */
|
||||
.codehilite .ss { color: #e6db74 } /* Literal.String.Symbol */
|
||||
.codehilite .bp { color: #f8f8f2 } /* Name.Builtin.Pseudo */
|
||||
.codehilite .fm { color: #a6e22e } /* Name.Function.Magic */
|
||||
.codehilite .vc { color: #f8f8f2 } /* Name.Variable.Class */
|
||||
.codehilite .vg { color: #f8f8f2 } /* Name.Variable.Global */
|
||||
.codehilite .vi { color: #f8f8f2 } /* Name.Variable.Instance */
|
||||
.codehilite .vm { color: #f8f8f2 } /* Name.Variable.Magic */
|
||||
.codehilite .il { color: #ae81ff } /* Literal.Number.Integer.Long */
|
13
static/script.js
Normal file
@ -0,0 +1,13 @@
|
||||
// Google Analytics boilerplate.
|
||||
|
||||
var _gaq = _gaq || [];
|
||||
_gaq.push(['_setAccount', 'UA-25704949-1']);
|
||||
_gaq.push(['_trackPageview']);
|
||||
|
||||
(function() {
|
||||
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async =
|
||||
true;
|
||||
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') +
|
||||
'.google-analytics.com/ga.js';
|
||||
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
|
||||
})();
|
123
static/style.css
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
consider one of these?
|
||||
https://meyerweb.com/eric/tools/css/reset/
|
||||
https://ageek.dev/normalize-css
|
||||
https://github.com/h5bp/html5-boilerplate
|
||||
*/
|
||||
|
||||
:root {
|
||||
--content-width: 650px;
|
||||
--footer-height: 22px;
|
||||
|
||||
/* Base colors */
|
||||
--color-black: black;
|
||||
--color-white: white;
|
||||
--color-navy: #1F2E4C;
|
||||
|
||||
/* Primary colors */
|
||||
--color-gray: #707372;
|
||||
--color-red: #EB5757;
|
||||
--color-purple: #90489C;
|
||||
|
||||
/* Accent colors */
|
||||
--color-yellow: #F2C94C;
|
||||
--color-light-orange: #F7E6CA;
|
||||
--color-light-green: #98E0B0;
|
||||
}
|
||||
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Quicksand', sans-serif;
|
||||
font-weight: 500;
|
||||
font-size: 16px;
|
||||
background: var(--color-navy);
|
||||
color: var(--color-white);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#page-container {
|
||||
position: relative;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
#content-wrap {
|
||||
padding-bottom: var(--footer-height);
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--color-light-orange);
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
a.undecorated {
|
||||
color: inherit;
|
||||
text-decoration: none;
|
||||
font-weight: inherit;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
margin-right: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: 'Fira Mono', monospace;
|
||||
color: var(--color-light-green);
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
pre {
|
||||
overflow: auto;
|
||||
font-family: 'Fira Mono', monospace;
|
||||
padding: .8em;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
td {
|
||||
width: 200px;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: var(--color-yellow);
|
||||
}
|
||||
|
||||
div.codehilite {
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
#header {
|
||||
background: var(--color-red);
|
||||
font-size: 24px;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
#header img {
|
||||
vertical-align: baseline;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
#footer {
|
||||
background: var(--color-purple);
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: var(--footer-height);
|
||||
}
|
||||
|
||||
div.content {
|
||||
max-width: var(--content-width);
|
||||
margin: auto;
|
||||
padding-left: 2px;
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
@media (min-width: var(--content-width)) {
|
||||
div.content {
|
||||
width: var(--content-width);
|
||||
}
|
||||
}
|
43
template.html
Normal file
@ -0,0 +1,43 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
||||
<title>__TITLE_GOES_HERE__</title>
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Quicksand:wght@500;700&display=block" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css?family=Fira+Mono:500&display=block" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/pygments.css">
|
||||
<link rel="stylesheet" href="/style.css">
|
||||
<link rel="icon" type="image/png" href="/favicon-32.png">
|
||||
<!-- TODO: add apple touch icon, maybe other favicon sizes -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<div id="header">
|
||||
<div class="content">
|
||||
<a href="/" class="undecorated">Colin McMillen</a>
|
||||
<span style="float: right;"><a href="https://twitter.com/mcmillen"><img src="img/twitter.svg" alt="Twitter"></a></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="content">
|
||||
__CONTENT_GOES_HERE__
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="footer">
|
||||
<div class="content">
|
||||
© 2021 <a href="/" class="undecorated">Colin McMillen</a>.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|