Code Behind the Button:
- var experience = {
- 1985: [ 'Applesoft BASIC', 'Apple DOS 3.3' ],
- 1987: '6502 assembly',
- 1989: [ 'Unix', 'the Internet' ],
- 1990: 'Pascal',
- 1991: [ 'C', 'MS-DOS' ],
- 1992: 'pre-Standard C++',
- 1993: [ '8086 assembly', 'Linux', 'Bourne shell scripting' ],
- 1994: [ 'HTML', 'Perl 4', 'Win16', 'Winsock', 'Borland OWL' ],
- 1995: [ 'patterns', 'Perl 5 (bless $me!)', '2D vector drawing' ],
- 1996: 'Java',
- 1997: [ 'Visual C++', 'Win32', 'Photoshop' ],
- 1998: [ 'C++98', 'Tcl/Tk 8.0', 'SQL' ],
- 1999: 'JavaScript',
- 2000: [ 'Python', 'MFC', 'Extreme Programming' ],
- 2001: 'analog electronics',
- 2002: 'MySQL',
- 2003: [ 'GNU Bash scripting', 'EAGLE' ],
- 2004: [ 'digital electronics', 'PIC assembly', 'Mathematica' ],
- 2005: [ 'UML', '3D modeling & rendering' ],
- 2006: [ 'Ruby', 'C.O.F.F.E.E.', 'wxPython', 'Ajax/Prototype' ],
- 2007: [ 'Flash', 'ActionScript', 'C++/CLI' ],
- 2008: 'Erlang',
- 2009: 'Lua',
- 2010: [ 'R', 'Arduino' ],
- 2011: [ 'Haskell', 'C++11' ],
- 2012: 'RPL',
- 2013: [ 'F#', '.NET', 'MS Office Automation', 'OCaml' ],
- 2014: [ 'jQuery', 'Dancer', 'Fossil (DVCS)' ],
- 2015: 'C++14',
- 2016: [ 'SQLite', 'PDP-8 assembly' ],
- 2017: [ 'Go (language)', 'FOCAL', 'FORTRAN II', 'FORTRAN IV' ],
- 2018: [ 'C++17', 'Tcl 8.6', 'HD-SDI' ],
- 2019: [ 'Cinema 4D', 'Jupyter' ],
- 2020: 'C++20',
- 2021: [ 'RouterOS', 'network engineering' ],
- 2022: [ 'Docker', 'Swarm', 'systemd-nspawn' ],
- 2023: [ 'dvLED Walls', 'Podman' ],
- 2024: 'container distribution',
- format: function(year) {
- var what = this[year];
- if (what === undefined) return '';
- if (!(what instanceof Array)) return what;
- if (what.length < 2) return '';
- var s = '';
- var wtmp = what.slice(0).reverse();
- while (wtmp.length > 2) s += wtmp.pop() + ', ';
- return s + wtmp[1] + ' and ' + wtmp[0];
- },
- init: function() {
- experience.test();
- var expBlock = $('#experience');
- var btn = $('<button></button>').
- text('So, Warren, what have you learned?').
- click(function() {
- expBlock.after(experience.résumé()).show();
- });
- expBlock.after(btn);
- $.get('js/resume.js', function(reply) {
- $('#resumeText').text(reply);
- prettyPrint();
- });
- },
- résumé: function() {
- var html = '';
- Object.keys(this).filter(function(k) {
- return parseInt(k, 10) > 0;
- }).sort().forEach(function(y) {
- var what = experience.format(y);
- html +=
- '<li>' +
- 'I learned ' + what + ' in ' + y + '.' +
- '</li>';
- });
- return '<ul>' + html + '</ul>';
- },
- test: function() {
- function assert(actual, expected) {
- if (actual != expected) {
- alert('FAIL: "' + actual + '" != "' + expected + '"!');
- throw 'things and sulk';
- }
- }
- assert(this.format(1969), ''); // error
- assert(this.format(1990), 'Pascal'); // singleton
- assert(this.format(1991).indexOf(' and '), 1); // pair
- assert(this.format(1998).indexOf(', '), 5); // triplet
- assert(this.format(2006).indexOf(' and '), 28); // tuple
- if (window.console) console.log('All good!');
- }
- };