diff --git a/404.html b/404.html index c9835ee..1cee7d8 100644 --- a/404.html +++ b/404.html @@ -1,25 +1,9 @@ - - - - - 404 - Earwig - - - -
- -
-
-

The page you're looking for doesn't exist – and I thought I had designed everything so well! *sniff*

-

Did I delete it? Did I redesign my site and move everything around aimlessly? WAS IT ABDUCTED BY ALIENS!? Who knows? Not my web server.

-

Well, you're welcome to look around a bit!

-
-
- -
- - +--- +layout: base +title: 404 +--- + +

¡punoℲ ʇoᴎ :ᔭ0ᔭ

+
+

The page you're looking for doesn't exist. You're welcome to look around a bit and try to find it.

+
diff --git a/_layouts/base.html b/_layouts/base.html index 6c69a52..e84fb48 100644 --- a/_layouts/base.html +++ b/_layouts/base.html @@ -2,17 +2,27 @@ - {{ page.title }} - Ben Kurtovic - - - - + {% if page.title == "Home" %} + Ben Kurtovic + {% else %} + {{ page.title }} - Ben Kurtovic + {% endif %} + + + + +
{{ content }}
diff --git a/_layouts/home.html b/_layouts/home.html deleted file mode 100644 index 7a22877..0000000 --- a/_layouts/home.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: base ---- - - -
- - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Emailben.kurtovic@gmail.com
kurtovc2@illinois.edu
GitHubearwig
IRCEarwig on irc.freenode.net
Wikipedia[[User:The Earwig]]
Twitter@the_earwig
LinkedInbenkurtovic
PGP KeyE8DBB515
-

Projects

- {{ content }} -
-
- Earwig -
-

I'm a software developer and Wikipedian currently studying computer science at the University of Illinois at Urbana–Champaign. I'm the guy behind mwparserfromhell and EarwigBot.

-

On this page, you can find my identities on a few other sites, check out the projects I'm working on, and read some of my strange ramblings in blog form.

-

Posts

-
    - {% for post in site.posts %} -
  • {{ post.date | date: "%b %d, %Y" }}: {{ post.title }}
    {{ post.description }} ()
  • - {% endfor %} -
-

Tweets

-
-
- - -
-
- diff --git a/_layouts/post.html b/_layouts/post.html index 46348c3..fbb96cd 100644 --- a/_layouts/post.html +++ b/_layouts/post.html @@ -2,12 +2,10 @@ layout: base --- - +

{{ page.title }}

-
- Date: {{ page.date | date: "%a, %b %d, %Y" }} +
+ Date: {{ page.date | date: "%B %-d, %Y" }}
{{ content }} diff --git a/index.html b/index.html index 3e34a89..0b7be64 100644 --- a/index.html +++ b/index.html @@ -1,175 +1,208 @@ --- -layout: home +layout: base title: Home --- -
-
- mwparserfromhell (Python + C // started May 2012) -
-
- MWParserFromHell is an easy-to-use and outrageously powerful Python parser for MediaWiki wikicode. -
-
-
-
-
- earwigbot (Python // started April 2009) -
-
- EarwigBot is a Python robot that edits Wikipedia and interacts with people over IRC. It has a separate repository for plugins. -
-
-
-
-
- bitshift (Python + SQL + Web // started March 2014) -
-
- Bitshift is a semantic search engine for source code. -
-
-
-
-
- copyvios (Python + Web // started July 2009) -
-
- Copyvios is a copyright violation detector running on Wikimedia Labs. -
-
- - - -
-
-
- goldfish (Java // started Jan 2013) -
-
- GoLdfish is a simple Game of Life implementation in Java. -
-
-
-
-
- starlorn (Java // started May 2013) -
-
- Starlorn is a shoot 'em up game with a sweet upgrade system and randomized levels. -
-
- - - - - - -
-
-
- cellar-strider (Python // started June 2012) -
-
- Cellar-Strider is a pseudo-roguelike game with a YAML-based level system. -
-
-
-
-
- oriadnos (C // started May 2014) -
-
- Oriadnos is a 3D maze exploration game written from scratch using matrix manipulation code, UV texture mapping, z-buffering, and simple lighting. -
-
-
-
-
- terminvaders (C // started Oct 2013) -
-
- Terminvaders is a terminal-based multiplayer arcade game inspired by Space Invaders. -
-
-
-
-
- databanks (C // started Nov 2013) -
-
- DataBanks is a simple database with a terminal-based interface for notekeeping. -
-
-
-
-
- omnithinker (Python + Web // started Nov 2013) -
-
- OmniThinker is an online brainstorming tool that displays relevant information from the web in a sidebar. -
-
-
-
-
- BAJA (Python + Web // started Jan 2014) -
-
- BAJA is a hacking game featuring multiple simulated websites, tied together by messages sent to the player from a mysterious individual using a fake email client. -
-
- - - - - - - - - -
-
-
- earwig.github.io (Web // started June 2011) -
-
- earwig.github.io is the site you're viewing right now in source code form. -
-
-
-
-
- git-repo-updater (Python // started June 2011) -
-
- Gitup is a console script that allows you to easily pull to multiple git repositories at once. -
-
-
-
-
- music-quizzer (Python // started May 2011) -
-
- MusicQuizzer is a Tk-based program that can help you prepare for your music final with randomly-generated listening quizzes. -
-
-
-
-
- lobo (NetLogo // started Dec 2011) -
-
- Lobo is Logo Bolo: a re-envisioning of the classic tank game by Stuart Cheshire in NetLogo. -
-
-
-
-
- func-smash (Python // started April 2012) -
-
- FuncSmash, a small for-the-hell-of-it project, tries to generate random Python functions using Markov chains. -
-
+ + + + + +
+

I'm a software developer and Wikipedian currently studying computer science at the University of Illinois at Urbana–Champaign. My work mostly focuses on text parsing and analysis; I'm also interested in programming language theory and algorithm design.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Emailben.kurtovic@gmail.com
kurtovc2@illinois.edu
GitHubearwig
IRCEarwig on irc.freenode.net
Wikipedia[[User:The Earwig]]
Twitter@the_earwig
LinkedInbenkurtovic
PGP KeyE8DBB515
+
+ + + + + +
+

Projects

+
+
+ mwparserfromhell (Python + C // started May 2012) +
+
+ MWParserFromHell is an easy-to-use and outrageously powerful Python parser for MediaWiki wikicode. +
+
+
+
+ earwigbot (Python // started April 2009) +
+
+ EarwigBot is a Python robot that edits Wikipedia and interacts with people over IRC. It has a separate repository for plugins. +
+
+
+
+ bitshift (Python + SQL + Web // started March 2014) +
+
+ Bitshift is a semantic search engine for source code. +
+
+
+
+ copyvios (Python + Web // started July 2009) +
+
+ Copyvios is a copyright violation detector running on Wikimedia Labs. +
+
+

Other projects

+
+
+ goldfish (Java // started Jan 2013) +
+
+ GoLdfish is a simple Game of Life implementation in Java. +
+
+
+
+ starlorn (Java // started May 2013) +
+
+ Starlorn is a shoot 'em up game with a sweet upgrade system and randomized levels. +
+
+
+
+ cellar-strider (Python // started June 2012) +
+
+ Cellar-Strider is a pseudo-roguelike game with a YAML-based level system. +
+
+
+
+ oriadnos (C // started May 2014) +
+
+ Oriadnos is a 3D maze exploration game written from scratch using matrix manipulation code, UV texture mapping, z-buffering, and simple lighting. +
+
+
+
+ terminvaders (C // started Oct 2013) +
+
+ Terminvaders is a terminal-based multiplayer arcade game inspired by Space Invaders. +
+
+
+
+ databanks (C // started Nov 2013) +
+
+ DataBanks is a simple database with a terminal-based interface for notekeeping. +
+
+
+
+ omnithinker (Python + Web // started Nov 2013) +
+
+ OmniThinker is an online brainstorming tool that displays relevant information from the web in a sidebar. +
+
+
+
+ BAJA (Python + Web // started Jan 2014) +
+
+ BAJA is a hacking game featuring multiple simulated websites, tied together by messages sent to the player from a mysterious individual using a fake email client. +
+
+
+
+ earwig.github.io (Web // started June 2011) +
+
+ earwig.github.io is the site you're viewing right now in source code form. +
+
+
+
+ git-repo-updater (Python // started June 2011) +
+
+ Gitup is a console script that allows you to easily pull to multiple git repositories at once. +
+
+
+
+ music-quizzer (Python // started May 2011) +
+
+ MusicQuizzer is a Tk-based program that can help you prepare for your music final with randomly-generated listening quizzes. +
+
+
+
+ lobo (NetLogo // started Dec 2011) +
+
+ Lobo is Logo Bolo: a re-envisioning of the classic tank game by Stuart Cheshire in NetLogo. +
+
+
+
+ func-smash (Python // started April 2012) +
+
+ FuncSmash, a small for-the-hell-of-it project, tries to generate random Python functions using Markov chains. +
+
+
+

Posts

+
    + {% for post in site.posts %} +
  • {{ post.date | date: "%b %-d, %Y" }}: {{ post.title }}
    {{ post.description }}
  • + {% endfor %} +
+
+ diff --git a/static/avatar.png b/static/avatar.png new file mode 100644 index 0000000..c55e405 Binary files /dev/null and b/static/avatar.png differ diff --git a/static/background.png b/static/background.png deleted file mode 100644 index 3d549f6..0000000 Binary files a/static/background.png and /dev/null differ diff --git a/static/date_format.js b/static/date_format.js deleted file mode 100644 index 466f649..0000000 --- a/static/date_format.js +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Date Format 1.2.3 - * (c) 2007-2009 Steven Levithan - * MIT license - * - * Includes enhancements by Scott Trenda - * and Kris Kowal - * - * Accepts a date, a mask, or a date and a mask. - * Returns a formatted version of the given date. - * The date defaults to the current date/time. - * The mask defaults to dateFormat.masks.default. - */ - -var dateFormat = function () { - var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g, - timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g, - timezoneClip = /[^-+\dA-Z]/g, - pad = function (val, len) { - val = String(val); - len = len || 2; - while (val.length < len) val = "0" + val; - return val; - }; - - // Regexes and supporting functions are cached through closure - return function (date, mask, utc) { - var dF = dateFormat; - - // You can't provide utc if you skip other args (use the "UTC:" mask prefix) - if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) { - mask = date; - date = undefined; - } - - // Passing date through Date applies Date.parse, if necessary - date = date ? new Date(date) : new Date; - if (isNaN(date)) throw SyntaxError("invalid date"); - - mask = String(dF.masks[mask] || mask || dF.masks["default"]); - - // Allow setting the utc argument via the mask - if (mask.slice(0, 4) == "UTC:") { - mask = mask.slice(4); - utc = true; - } - - var _ = utc ? "getUTC" : "get", - d = date[_ + "Date"](), - D = date[_ + "Day"](), - m = date[_ + "Month"](), - y = date[_ + "FullYear"](), - H = date[_ + "Hours"](), - M = date[_ + "Minutes"](), - s = date[_ + "Seconds"](), - L = date[_ + "Milliseconds"](), - o = utc ? 0 : date.getTimezoneOffset(), - flags = { - d: d, - dd: pad(d), - ddd: dF.i18n.dayNames[D], - dddd: dF.i18n.dayNames[D + 7], - m: m + 1, - mm: pad(m + 1), - mmm: dF.i18n.monthNames[m], - mmmm: dF.i18n.monthNames[m + 12], - yy: String(y).slice(2), - yyyy: y, - h: H % 12 || 12, - hh: pad(H % 12 || 12), - H: H, - HH: pad(H), - M: M, - MM: pad(M), - s: s, - ss: pad(s), - l: pad(L, 3), - L: pad(L > 99 ? Math.round(L / 10) : L), - t: H < 12 ? "a" : "p", - tt: H < 12 ? "am" : "pm", - T: H < 12 ? "A" : "P", - TT: H < 12 ? "AM" : "PM", - Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""), - o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4), - S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10] - }; - - return mask.replace(token, function ($0) { - return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1); - }); - }; -}(); - -// Some common format strings -dateFormat.masks = { - "default": "ddd mmm dd yyyy HH:MM:ss", - shortDate: "m/d/yy", - mediumDate: "mmm d, yyyy", - longDate: "mmmm d, yyyy", - fullDate: "dddd, mmmm d, yyyy", - shortTime: "h:MM TT", - mediumTime: "h:MM:ss TT", - longTime: "h:MM:ss TT Z", - isoDate: "yyyy-mm-dd", - isoTime: "HH:MM:ss", - isoDateTime: "yyyy-mm-dd'T'HH:MM:ss", - isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'" -}; - -// Internationalization strings -dateFormat.i18n = { - dayNames: [ - "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", - "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" - ], - monthNames: [ - "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", - "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" - ] -}; - -// For convenience... -Date.prototype.format = function (mask, utc) { - return dateFormat(this, mask, utc); -}; diff --git a/static/main.css b/static/main.css index 6d427ec..e544870 100644 --- a/static/main.css +++ b/static/main.css @@ -1,236 +1,140 @@ body { - max-width: 1000px; - margin: auto; - padding: 0 40px 0 40px; - font-family: helvetica, arial, clean, sans-serif; + margin: 0; + background-color: white; + color: black; + font-family: sans-serif; /* TODO */ font-size: 16px; - color: #000; - background: #E0E0E0 url("/static/background.png") repeat top left; -} - -p { - line-height: 1.25em; } -.color-highlight { - color: #040; -} +a:link { color: #3d7751; text-decoration: none; } +a:visited { color: #3d7751; text-decoration: none; } +a:hover { color: #041; text-decoration: underline; } +a:active { color: #403; text-decoration: underline; } -.highlight, .highlighttable { - background: #f2f2f2; - border: 1px solid #e8e8e8; - border-radius: 10px; - padding-left: 16px; - line-height: 1.35em; - font-size: 14px; -} - -.highlighttable { - width: 100%; -} - -.highlighttable .highlight { - border: 0; -} +a.underlined:link, a.underlined:visited { text-decoration: underline; } +a.underlined:hover, a.underlined:active { text-decoration: none; } -.linenos { - color: #888; -} - -.description { - font-size: 14px; -} - -.index-header { - padding-top: 15px; +#banner { + background-color: black; text-align: center; } -pre { - white-space: pre-wrap; +#banner a { + color: white; + text-decoration: none; } -code { - background: #f2f2f2; - border: 1px solid #e8e8e8; - padding: 0 3px; +#banner img { + display: inline; + padding: 2px 0.5em 0 0; + vertical-align: top; } -pre code { - border: 0; - padding: 0; +#banner h1 { + display: inline; + font-family: sans-serif; /* TODO */ + text-align: center; } -div.project { - border: 1px solid #DDD; - border-radius: 5px; +.banner-large { + height: 94px; + line-height: 94px; + border-top: 6px solid #3d7751; } -div.project-head { - padding: 6px 15px 6px 15px; - border-bottom: 1px solid #DDD; - border-radius: 5px 5px 0px 0px; - - /* all I want is a simple background gradient without images! */ - background: #E0E0E0; /* fallback (your browser is crap) */ - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#E3E3E3), to(#CACACA)); /* Chrome, Safari 4+ */ - background: -webkit-linear-gradient(top, #E3E3E3, #CACACA); /* Chrome 10+, Safari 5+ */ - background: -moz-linear-gradient(top, #E3E3E3, #CACACA); /* Firefox 3.6+ */ - background: -ms-linear-gradient(top, #E3E3E3, #CACACA); /* IE 10+ (lol) */ - background: -o-linear-gradient(top, #E3E3E3, #CACACA); /* Opera 11.10+ */ - background: linear-gradient(top, #E3E3E3, #CACACA); /* God-tier */ +.banner-large img { + height: 92px; } -div.project-body { - padding: 6px 15px 9px 15px; - border-radius: 0px 0px 5px 5px; - - background: #F4F4F4; - background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(#F9F9F9), to(#EFEFEF)); - background: -webkit-linear-gradient(top, #F9F9F9, #EFEFEF); - background: -moz-linear-gradient(top, #F9F9F9, #EFEFEF); - background: -ms-linear-gradient(top, #F9F9F9, #EFEFEF); - background: -o-linear-gradient(top, #F9F9F9, #EFEFEF); - background: linear-gradient(top, #F9F9F9, #EFEFEF); */ +.banner-large h1 { + font-size: 2.5em; } -div.divider { - border-bottom: 1px solid #CCC; - margin-top: 15px; - margin-bottom: 15px; +.banner-small { + height: 66px; + line-height: 66px; + border-top: 4px solid #3d7751; } -td.about-l { - padding: 4px 12px 4px 12px; - border-left: 1px solid #CCC; +.banner-small img { + height: 64px; } -td.about-r { - padding: 4px 12px 4px 12px; - border-right: 1px solid #CCC; +.banner-small h1 { + font-size: 2em; } -li.post { - margin-bottom: 20px; +#container { + margin: 1.5em auto 0; + max-width: 1000px; + padding: 0 40px 0 40px; } -td.light-l { background-color: #ECECEC; } -td.dark-l { background-color: #DADADA; } -td.light-r { background-color: #F7F7F7; } -td.dark-r { background-color: #E5E5E5; } - -p#about-me-top { - margin-top: 0px; +#container p { + line-height: 1.25em; } -h1#head { - margin-top: 0px; - padding-top: 0px; - margin-bottom: 0px; - padding-bottom: 0px; - text-align: center; +#content p, #content ol, #content li { + line-height: 1.75em; } -div#container { - margin: 30px auto 30px auto; - border: 1px solid #999; - border-radius: 10px; - background-color: #FFF; +.project { + margin-bottom: 1.25em; } -div#header { - margin: 30px; - padding: 35px 0px 35px 0px; - border: 1px solid #999; - border-radius: 10px 10px 0px 0px; - - /* see div.project-head for details */ - background: #DDEEDD; - background: -webkit-gradient(linear, left top, left bottom, from(#E4F1E4), to(#B1BEB1)); - background: -webkit-linear-gradient(top, #E4F1E4, #B1BEB1); - background: -moz-linear-gradient(top, #E4F1E4, #B1BEB1); - background: -ms-linear-gradient(top, #E4F1E4, #B1BEB1); - background: -o-linear-gradient(top, #E4F1E4, #B1BEB1); - background: linear-gradient(top, #E4F1E4, #B1BEB1); +.project div:nth-child(2) { + font-size: 14px; } -div#content { - padding: 0 30px; +#post-list li { + margin-bottom: 1.25em; } -div#footer { +.subtitle { font-size: 14px; - text-align: center; - padding: 9px 4px 12px 4px; - color: #222; -} - -div#post-info { - margin-left: 24px; } -div#post p, div#post ol, div#post li { - line-height: 1.75em; +#post-info span { + color: #777; } -div#avatar-box { - float: right; - position: relative; - left: 50px; - margin-left: -40px; - padding: 12px; - background-color: #FFF; - border: 1px solid #999; - border-radius: 5px; - - -webkit-transform:rotate(3deg); - -moz-transform:rotate(3deg); - -o-transform:rotate(3deg); - -ms-transform:rotate(3deg); +pre { + white-space: pre-wrap; } -div#follow-button-box { - float: right; +code { + background: #f2f2f2; + border: 1px solid #e8e8e8; + padding: 0 3px; } -ul#post-list { - padding-left: 1em; +pre code { + border: 0; + padding: 0; } -img#avatar { - border-radius: 5px; +.highlight, .highlighttable { + background: #f2f2f2; + border: 1px solid #e8e8e8; + font-size: 14px; + line-height: 1.35em; + padding-left: 16px; } -table#about { +.highlighttable { width: 100%; } -td#left-box { - width: 50%; - vertical-align: top; +.highlighttable .highlight { + border: 0; } -td#right-box { - padding-left: 25px; - vertical-align: top; +.linenos { + color: #888; } -td#about-tl { border-top-left-radius: 5px; border-top: 1px solid #AAA; } -td#about-tr { border-top-right-radius: 5px; border-top: 1px solid #AAA; } -td#about-bl { border-bottom-left-radius: 5px; border-bottom: 1px solid #AAA; } -td#about-br { border-bottom-right-radius: 5px; border-bottom: 1px solid #AAA; } - -a:link { color: #373; text-decoration: none; } -a:visited { color: #373; text-decoration: none; } -a:hover { color: #040; text-decoration: underline; } -a:active { color: #404; text-decoration: underline; } - -a.invert:link { text-decoration: underline; } -a.invert:visited { text-decoration: underline; } -a.invert:hover { text-decoration: none; } -a.invert:active { text-decoration: none; } - -a.incognito:link { color: #000; text-decoration: none; } -a.incognito:visited { color: #000; text-decoration: none; } -a.incognito:hover { color: #000; text-decoration: underline; } -a.incognito:active { color: #000; text-decoration: none; } +#footer { + color: #444; + font-size: 85%; + text-align: center; +}