extends /layout.pug block extra_head meta(name='description', content='PhD candidate in Semitic linguistics') style. table.conferences tr.year { border-color: black; border-style: solid; border-width: 1px 0 0 0; } table.conferences tr.spacer { height: .8ex; } table.conferences tr.year td { padding-bottom: .4ex; } table.conferences tr.entry { color: gray; } table.conferences i.fas, table.conferences i.fab { margin-right: .2ex; } .green { color: #0a0; } .red { color: #a00; } block titleContainer block content - const BIKE_CARBON_FOOTPRINT_KM = 30; const DOMESTIC_FLIGHT_THRESHOLD = 500; h1 Visited conferences div.alert.alert-info p. This page gives an overview of the conferences, workshops, and summer schools I have visited together with the #[strong travel carbon footprint]. The #[strong accomodation] I used is also listed, but not included in the carbon footprint. The calculation is based on averages from #[a.alert-link(href='https://ourworldindata.org/travel-carbon-footprint', target='_blank') Our World in Data]. p. For #[strong biking], I counted 30 g CO#[sub 2] / km as a rough estimate based on my diet. #[strong Flights] shorter than 500km are counted as 'domestic' (255 g / km), otherwise they are counted as short/long-haul (averaged on 153 g / km). #[strong Trains] in the Netherlands probably emit less than the estimate from Our World in Data because #[a.alert-link(href='https://www.ns.nl/over-ns/duurzaamheid/fossielvrij', target='_blank') the NS runs on wind energy]. p. The carbon footprint per capita of the Netherlands was #[strong 9.66] t in 2017 (26,448 g / day), according to #[a.alert-link(href='https://ourworldindata.org/co2/country/netherlands?country=NLD~DEU~DNK~SWE~FRA~BEL', target='_blank') Our World in Data]. The global average was #[strong 4.79] t in 2016 (13,114 g / day), according to #[a.alert-link(href='https://www.worldometers.info/co2-emissions/co2-emissions-per-capita/', target='_blank') Worldometer]. p. Transport, aviation, and shipping #[a.alert-link(href='https://ourworldindata.org/grapher/ghg-emissions-by-sector?time=latest&country=~NLD', target='_blank') make up 34% of emissions in the Netherlands]. For the average Dutch person this is #[strong 3.28] t per year or #[strong 8,992] g per day (but note that this includes more than personal travel). Worldwide, we have #[a.alert-link(href='https://ourworldindata.org/emissions-by-sector#transport-16-2', target='_blank') 16.2% of emissions from transport], which makes this figure #[strong 0.78] t per year or #[strong 2,125] g per day per capita. p. I don't know much about computing carbon footprint. #[strong Please let me know if you think something can be done better!] - // Accepts "Y-M-D to [[Y-]M-]D", i.e. you can leave out repeated parts in // the second date. "2019-7-8 to 10" means "2019-7-8 to 2019-7-10". // You can also give only one date. function parse_date_range(s) { s = s.split(' to ').map(d => d.split('-')); let from = {year: s[0][0], month: s[0][1], day: s[0][2]}; // If only day or month-day is given in the second date, add year-month // or year from the first date. let to; if (s.length == 1) to = from; else if (s[1].length == 1) to = {year: from.year, month: from.month, day: s[1][0]}; else if (s[1].length == 2) to = {year: from.year, month: s[1][0], day: s[1][1]}; else to = {year: s[1][0], month: s[1][1], day: s[1][2]}; return { from: new Date(from.year, from.month-1, from.day), to: new Date(to.year, to.month-1, to.day) }; } function nr_of_days(conf) { return 1 + (conf.to - conf.from) / 24 / 3600 / 1000; } // Computes footprint in grams CO2, according to // https://ourworldindata.org/travel-carbon-footprint. // See the explanation in the paragraph at the top of the page. function compute_carbon_footprint(conf) { let footprint = 0; if (conf.bike) footprint += BIKE_CARBON_FOOTPRINT_KM * conf.bike; if (conf.ferry) footprint += 19 * conf.ferry; if (conf.plane) footprint += (conf.plane < DOMESTIC_FLIGHT_THRESHOLD ? 255 : 153) * conf.plane; if (conf.train) footprint += 41 * conf.train; return footprint * (conf.multiplier || 2); } function year_summary(conferences, year) { conferences = conferences.filter(c => c.from.getFullYear() == year); let summary = { conferences: conferences.length, total_days: conferences.map(nr_of_days).reduce((x,y) => x + y, 0), total_footprint: conferences.map(compute_carbon_footprint).reduce((x,y) => x + y, 0), }; summary.total_footprint_per_day = summary.total_footprint / summary.total_days; return summary; } let conferences = []; mixin conf(dates, location, distance, shorttitle, title) - let conf = parse_date_range(dates); conf.location = location; conf.distance = distance; conf.shorttitle = shorttitle; conf.title = title || shorttitle; Object.assign(conf, attributes); conf.footprint = compute_carbon_footprint(conf); conferences.push(conf); mixin listconferences() - conferences.sort((x,y) => x.from - y.from || x.to - y.to); let last_year = null; table.conferences thead tr th Year th Month th Location th Travel modes th(colspan=2) Carbon footprint (g CO#[sub 2]) th Accomodation th Title - for (const conf of conferences) if last_year != conf.from.getFullYear() - last_year = conf.from.getFullYear(); - let summary = year_summary(conferences, last_year); tr.spacer tr.year td= conf.from.getFullYear() td(colspan=7). #[strong= summary.conferences] conference#{summary.conferences == 1 ? '' : 's'} over #[strong= summary.total_days] day#{summary.total_days == 1 ? '' : 's'}, for a total of #[strong= (summary.total_footprint).toLocaleString('en')] g CO#[sub 2], averaging #[strong(class!=summary.total_footprint_per_day > 2125 ? 'red' : 'green')= (summary.total_footprint_per_day).toLocaleString('en', {maximumFractionDigits: 0})] g CO#[sub 2] / day. tr.entry td td(title!=conf.from.toDateString() + ' to ' + conf.to.toDateString()) = conf.from.toLocaleString('default', {month: 'short'}) if conf.from.getMonth() != conf.to.getMonth() | – = conf.to.toLocaleString('default', {month: 'short'}) td = conf.location if conf.distance = ' (' + (conf.distance).toLocaleString('en') + 'km)' td if conf.bike i.fas.fa-bicycle(alt='Bike', title!='Bike: ' + conf.bike + 'km one-way') if conf.ferry i.fas.fa-ship(alt='Ferry', title!='Ferry: ' + conf.ferry + 'km one-way') if conf.train i.fas.fa-train(alt='Train', title!='Train: ' + conf.train + 'km one-way') if conf.plane i.fas.fa-plane(alt='Plane', title!='Plane: ' + conf.plane + 'km one-way') td.text-right= (conf.footprint).toLocaleString('en') td.text-right= (conf.footprint / nr_of_days(conf)).toLocaleString('en', {maximumFractionDigits: 0}) + ' / day' td if conf.airbnb i.fab.fa-airbnb(alt='Airbnb', title='Airbnb') if conf.hotel i.fas.fa-hotel(alt='Hotel', title='Hotel') if conf.friendstay i.fas.fa-home(alt='With a friend', title='With a friend') td a(href!=conf.url, target='_blank', title!=conf.title)!= conf.shorttitle +conf('2017-1-6', 'Nijmegen', 45, 'NL-FP Day', 'Dutch Functional Programming Day')(train=40, url='https://clean.cs.ru.nl/NL-FP_dag_2017') +conf('2017-7-10 to 21', 'Leiden', 61, 'Summer School in Languages and Linguistics', 'Leiden Summer School in Languages and Linguistics')(train=75, multiplier=20, url='https://www.universiteitleiden.nl/en/education/study-programmes/summer-schools/summer-school-in-languages-and-linguistics') +conf('2018-1-5', 'Apeldoorn', 41, 'NL-FP Day', 'Dutch Functional Programming Day')(train=61, url='https://clean.cs.ru.nl/NL-FP_dag_2018') +conf('2018-1-26', 'Nijmegen', 0, 'CLIN', 'Computational Linguistics in the Netherlands')(url='https://clin28.cls.ru.nl/') +conf('2019-7-8 to 10', 'Cambridge', 393, 'BHLAP', 'Biblical & Rabbinic Hebrew: New Perspectives in Philology & Linguistics')(bike=305, ferry=200, airbnb, url='https://www.ames.cam.ac.uk/whats-on/events-archive/biblical-rabinic-hebrew-conference') +conf('2019-10-7 to 8', 'Utrecht', 59, 'CLSoR', 'Workshop on Cross-Linguistic Semantics of Reciprocals')(train=72, friendstay, url='https://rocky.sites.uu.nl/workshop-on-cross-linguistic-semantics-of-reciprocals/') +conf('2020-1-10', 'Amsterdam', 88, 'NL-FP Day', 'Dutch Functional Programming Day')(train=100, url='https://sites.google.com/view/nl-fp-day-2020/home') +conf('2020-3-31', 'Online', 0, '#SemiticsTwitterCoronaConference')(url='https://www.academia.edu/42297049/') +conf('2020-10-11', 'Online', 0, 'Syntax Workshop')(url='https://sites.google.com/view/syntaxworkshop') +conf('2020-11-29 to 12-11', 'Online', 0, 'SBL Annual', 'SBL Annual Meeting')(url='https://www.sbl-site.org/meetings/Congresses_Abstracts.aspx?MeetingId=37') +listconferences()