42 changed files with 5938 additions and 0 deletions
-
73build.py
-
34content/index.md
-
84content/publications.md
-
28content/resume.md
-
141content/test.md
-
45linkify.py
-
BINstatic/favicon-32.png
-
BINstatic/favicon-512.png
-
BINstatic/favicon.png
-
1static/googledb51837fb3ea4073.html
-
1static/googlehostedservice.html
-
1static/img/git.svg
-
1static/img/nintendoswitch.svg
-
1static/img/playstation.svg
-
1static/img/steam.svg
-
1static/img/twitch.svg
-
1static/img/twitter.svg
-
131static/language_checklist.html
-
BINstatic/papers/Drenner-2002-ICRA-final.pdf
-
BINstatic/papers/Drenner-2002-NRL-final.pdf
-
BINstatic/papers/Ketter-2004-AAMAS-final.pdf
-
BINstatic/papers/Ketter-2004-AAMAS-workshop.pdf
-
BINstatic/papers/Ketter-2004-AAMAS.pdf
-
BINstatic/papers/Kratochvil-2003-ICRA-final.pdf
-
BINstatic/papers/McMillen-2002-IAS-final.pdf
-
BINstatic/papers/McMillen-2003-RAS-final.pdf
-
BINstatic/papers/McMillen-2003-UndergradThesis-final.pdf
-
BINstatic/papers/McMillen-2005-NRL-final.pdf
-
BINstatic/papers/McMillen-2006-DARS-final.pdf
-
BINstatic/papers/McMillen-2006-RoboCup-final.pdf
-
BINstatic/papers/McMillen-2006-TheoryML-final.pdf
-
BINstatic/papers/McMillen-2007-AAAI-final.pdf
-
BINstatic/papers/McMillen-2007-proposal.pdf
-
BINstatic/papers/McMillen-2008-AAAI-final.pdf
-
BINstatic/papers/Stoeter-2002-RAS-final.pdf
-
5145static/papers/Stubbs-2003-ITSA-final.pdf
-
BINstatic/papers/Veloso-2006-Humanoids.pdf
-
BINstatic/papers/mcmillen-thesis.pdf
-
70static/pygments.css
-
13static/script.js
-
123static/style.css
-
43template.html
@ -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() |
@ -0,0 +1,34 @@ |
|||
# Welcome! |
|||
|
|||
I'm the lead developer at [SemiColin Games](https://www.semicolin.games). |
|||
Previously at Google, reCAPTCHA, & Carnegie Mellon. |
|||
|
|||
| | | |
|||
|-|-| |
|||
| [](https://twitter.com/mcmillen) [@mcmillen](https://twitter.com/mcmillen) | [](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! |
|||
|
|||
| | | |
|||
|-|-| |
|||
| [](https://twitch.tv/FamiColin) [FamiColin](https://twitch.tv/FamiColin) | [](https://steamcommunity.com/id/FamiColin/) [FamiColin](https://steamcommunity.com/id/FamiColin/) | |
|||
| [](https://psnprofiles.com/robomancer) [robomancer](https://psnprofiles.com/robomancer) |  SW-1906-3662-4308 | |
|||
|
|||
## Recent Posts |
|||
|
|||
* dolor woomy elispioscpcsposp veemo |
|||
* another one |
|||
* post #3 |
|||
|
|||
## Other Stuff |
|||
|
|||
sigbovik etc |
|||
|
|||
|
|||
|
|||
|
@ -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. |
@ -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 |
@ -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` |
@ -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() |
After Width: 32 | Height: 32 | Size: 3.1 KiB |
After Width: 512 | Height: 512 | Size: 210 KiB |
After Width: 1000 | Height: 1000 | Size: 648 KiB |
@ -0,0 +1 @@ |
|||
google-site-verification: googledb51837fb3ea4073.html |
@ -0,0 +1 @@ |
|||
google94bca5e76bc84f5 |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
@ -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> |
5145
static/papers/Stubbs-2003-ITSA-final.pdf
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View 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 */ |
@ -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); |
|||
})(); |
@ -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); |
|||
} |
|||
} |
@ -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> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue