add site content

This commit is contained in:
Colin McMillen 2021-06-28 13:30:52 -04:00
parent f3a43268eb
commit 54495f8872
42 changed files with 5938 additions and 0 deletions

73
build.py Normal file
View 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
View 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
View 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
View 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
View 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 didnt 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 its 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? Its 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 Im 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 thats 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, lets 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 (Ive 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 Peets 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
static/favicon-512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 648 KiB

View File

@ -0,0 +1 @@
google-site-verification: googledb51837fb3ea4073.html

View File

@ -0,0 +1 @@
google94bca5e76bc84f5

1
static/img/git.svg Normal file
View 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

View 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

View 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
View 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
View 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
View 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

View 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>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

70
static/pygments.css Normal file
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 */

13
static/script.js Normal file
View 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
View 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
View 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">
&copy 2021 <a href="/" class="undecorated">Colin McMillen</a>.
</div>
</div>
</div>
</body>
</html>